דף הבית >> זיכרון דינמי>>הגדרת זיכרון עבור אוביקטים

הגדרת זיכרון עבור אוביקטיים

אפשר לאתר זיכרון אוביקטים בצורה דינמית ע"י new .מתי שאתהעושה זאת אובייקט נוצר ופויינטר מוחזר אליו.הזיכרון הדינמי שיוצר אובייקט מתנהג בדיוק כמו כל אובייקט אחר ,מתי שהוא נוצר פונקציית הבנייה נקראת ומתי שהאובייקט משוחרר הפונקצייה ההורסת נקראת . הצגה של תוכנית קצרה אשר יוצרת מחלקה שנקראת בשם balance אשר מקשרת שם אדם אם החשבון בנק שלו ,בתוך הmain אובייקט מסוג balance נוצר בצורה דינמית.


#include <iostream.h>
#include <new.h>
#include <cstring.h>

class balance {
         double cur_bal;  
char name [80];
public:         
         void set (double n, char *s)  {
            cur_bal = n ;
           strcpy (s , name) ;
         }
};
int main ( )
{
  balance  * p ;
  char s[80];
  double  n;
  try {
        p = new balance;
       }
 catch ( bad_alloc xa )  {
            cout<<" allocation failure  \n ";
            return  1;
                                     }
p-> set (12387.87 , "ralph wilson" ) ;
p-> get_bal (n , s);
cout << s << " 's balance is; " <<  n ;
cout << " \n " ;
delete p ;
return 0;
}



בגלל ש p מכיל פויינטר לאובייקט , אופרטור החץ משמש גישה לחברים של האובייקט.לזיכרון דינמי של אובייקטים יש פונקציות בנייה והריסה ,הדוגמה הבאה תמחיש את הגירסה של התוכנית הקודמת.

 
#include <iostream.h>
#include <new.h>
#include <castring.h>

class balance {
         double cur_bal;      
char name [80];
public:        
          balance( double n , char *s){        
          cur_bal = n ;     
          strcpy (name , s ) ;  
}
~balance( ) {
cout << "destructing " ;
cout << name <<"\n" ;
}
         void get_bal  (double  &n, char *s)  {
            n = cur_bal ;
           strcpy (s , name) ;
         }
};

int main ( )
{
  balance  * p ;
  char s[80];
  double  n;
  try {
        p = new balance (12387.87 ," ralph wilson " );
       }
 catch ( bad_alloc xa )  {
            cout<<" allocation failure  \n ";
            return  1;
                                     }

p-> get _bal( n , s ) ;
cout << s << " 's balance is; " <<  n ;
cout << " \n " ;
delete p ;
return 0;
}


הפרמטרים של אוביקטיי פונקציות הבנאים מציינים את סוג השם,אפשר גם אלתר זיכרון לוקטור של אוביקטים אבל אתה חייב שתהייה התאמה בקלאס באחד מפונקציות הבנאים,אם לא התוכנית לא תוכל לתקמפל.הצגת דוגמא של וקטור של balance אוביקטים אשר מאותרים בזיכרון הדינמי והפרמטרים השייכים קוראים לבנאים.

 
#include <iostream.h>
#include <new.h>
#include <castring.h>

class balance {
         double cur_bal;
char name [80];
public:        
          balance( double n , char *s){        
          cur_bal = n ;     
          strcpy (name , s ) ;
}
balance( )  { } ;
~balance( ) {
cout << "destructing " ;
cout << name <<"\n" ;
}
         void get_bal  (double  n, char *s)  {
          cur_bal =  n;
           strcpy (name , s ) ;
         }
   void get_bal(double &n , char *s )  {
   n = cur_bal;
   strcpy (s , name ) ;
   }
};
int main ( )
{
  balance  * p ;
  char s[80];
  double  n;
  int  i ;
  try {
        p = new balance  [3]  ;
       }
 catch ( bad_alloc xa )  {
            cout<<" allocation failure  \n ";
            return  1;
                                     }
p[0].set (12387.87   , "ralph wilson ") ;
p[1].set (144.00   , " A.C. conners ") ;
p[2].set (-11.23   , "I.M.  overdrawn") ;

  for ( i=1; i <3  ; i++ )  {   
     p[i].get_bal ( n , s );
     cout<< s << " 's balance  is : " << n ;
     cout <<" \n " ;
  }
delete  []  p;
return 0 ;
}


הפלט של תוכנית זו יהייה:

 


ralph wilson balance is:  12387.9

A.C. conners balance is :144

I.M.  overdrawn balance is:-11.23

destructing  I.M.  overdrawn

destructing  A.C. conners

destructing  ralph wilson


 

יש סיבה אחת אשר אנו צריכים להשתמש בצורה של [] delete כאשר מוחקים מערך של אוביקטים בזיכרון דינמי ,בכדי שהפונקצייה ההורסת תוכל להיקרא עבור כל אחד מהאוביקטים במערך.

הקודם
הבא