ترکيب : اشياء به عنوان اعضای کلاس ها

   شيء AlarmClock (زنگ ساعت) بايد بداند که چه وقت به صدا در آيد، پس بهتر است شيئی از نوع Time را به عنوان يکی از اعضای خود داشته باشد. چنين قابليتی در کلاس ها ترکيب ناميده می شود. يعنی يک کلاس می تواند کلاس يا کلاسهای ديگری را به عنوان يکی از اعضای خود داشته باشد.

   با روش ارسال آرگومانها به تابع سازنده هنگام ايجاد شیء آشنا می باشيم. در اين مبحث روش ارسال آرگومان به تابع سازنده شیء عضو کلاس و مقدار دهی اوليه به آن را بررسی می کنيم. برای آشنايی با اين روش به برنامه زير توجه کنيد:

#include <iostream.h>
#include <string.h>
 
class Date {
 
  public:
    Date( int = 1, int = 1, int = 1900 );
    void print() const;
    ~Date();
 
  private:
    int month; // 1-12 (January-December)
    int day; // 1-31 based on month
    int year; // any year
 
    int checkDay( int ) const; 
};
 
Date::Date( int mn, int dy, int yr )
{
  if ( mn > 0 && mn <= 12 ) 
    month = mn;
  else { 
    month = 1;
    cout << "Month " << mn 
         << " invalid. Set to month 1.\n";
  }
 
  year = yr; 
  day = checkDay( dy ); 
 
  cout << "Date object constructor for date ";
  print(); 
  cout << endl;
}
 
 
void Date::print() const
{
  cout << month << '/' << day << '/' << year; 
}
 
Date::~Date()
{ 
  cout << "Date object destructor for date ";
  print();
  cout << endl;
}
 
int Date::checkDay( int testDay ) const
{
  static const int daysPerMonth[ 13 ] = 
    { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
 
 
if ( testDay > 0 && testDay <= daysPerMonth[ month ] )
  return testDay;
 
if ( month == 2 && testDay == 29 &&
     ( year % 400 == 0 || 
       ( year % 4 == 0 && year % 100 != 0 ) ) )
  return testDay;
 
  cout << "Day " << testDay 
       << " invalid. Set to day 1.\n";
 
  return 1;
}
 
class Employee {
 
  public:
    Employee(const char *, const char *, 
              const Date &, const Date & );
 
    void print() const;
    ~Employee();
 
  private:
    char firstName[ 25 ];
    char lastName[ 25 ];
    const Date birthDate; //composition: member object
    const Date hireDate;  //composition: member object
};
 
 
Employee::Employee(const char *first, const char *last,
      const Date &dateOfBirth, const Date &dateOfHire )
     : birthDate( dateOfBirth ),
       hireDate( dateOfHire )
{
  int length = strlen( first );
  length = ( length < 25 ? length : 24 );
  strncpy( firstName, first, length );
  firstName[ length ] = '\0';
 
  length = strlen( last );
  length = ( length < 25 ? length : 24 );
  strncpy( lastName, last, length );
  lastName[ length ] = '\0';
 
  cout << "Employee object constructor: "
       << firstName << ' ' << lastName << endl;
}
 
void Employee::print() const
{
  cout << lastName << ", " << firstName << "\nHired: ";
  hireDate.print();
  cout << " Birth date: ";
  birthDate.print();
  cout << endl;
}
 
Employee::~Employee()
{ 
  cout << "Employee object destructor: " 
       << lastName << ", " << firstName << endl;
}
 
 
int main()
{
  Date birth( 7, 24, 1949 );
  Date hire( 3, 12, 1988 );
  Employee manager( "Bob", "Jones", birth, hire );
 
  cout << '\n';
  manager.print();
 
  cout << "\nTest Date constructor "
       <<"with invalid values:\n";
  Date lastDayOff(14,35,1994); //invalid month and day
  cout << endl;
 
  return 0;
}

خروجی برنامه فوق به صورت زير می باشد:

Date object constructor for date 7/24/1949
Date object constructor for date 3/12/1988
Employee object constructor: Bob Jones
 
Jones, Bob
Hired: 3/12/1988 Birth date: 7/24/1949
 
Test Date constructor with invalid values:
Month 14 invalid. Set to month 1.
Day 35 invalid. Set to day 1.
Date object constructor for date 1/1/1994
 
Date object destructor for date 1/1/1994
Employee object destructor: Jones, Bob
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949
Date object destructor for date 3/12/1988
Date object destructor for date 7/24/1949

   در برنامه فوق دو کلاس Date و Employee ايجاد شده است. کلاس Employee  دارای چهار عضو داده خصوصی به نامهای firstName و lastName و birthDate و hireDate می باشد. اعضای birthDate و hireDate خود اشياء ثابتی از نوع کلاس  Date می باشند که دارای اعضای داده خصوصی month و day و year هستند. تعريف تابع سازنده کلاس Employee مشخص می کند که سازنده چهار آرگومان fname و lname و  dateOfBirth و dateOfHire را دريافت می کند. دو آرگومان اول اعضای firstName و lastName  را مقدار دهی می کنند. دو آرگومان بعدی يعنی dateOfBirth و dateOfHire توسط birthDate و hireDate که اشيايی از نوع کلاس Date می باشند به سازنده های اين اشياء ارسال می گردند و اين دو شیء را مقدار دهی اوليه می کنند.

Employee::Employee(const char *first, const char *last,
      const Date &dateOfBirth, const Date &dateOfHire )
     : birthDate( dateOfBirth ),
       hireDate( dateOfHire )

   همانطور که در دستور فوق می بينيد بعد از ليست آرگومانها علامت ( : ) قرار گرفته است و بعد از آن نام دو شیء عضو کلاس Employee که از نوع کلاس Date می باشند، قرار دارد. اين روش برای مقدار دهی اوليه به اشياء عضو يک کلاس از طريق آرگومانهای کلاس اصلی، مورد استفاده قرار می گيرد.

   نکته:تابع عضو print از کلاس Date ، در تابع سازنده اين کلاس بدون هيچ آرگومانی فراخوانی شده است. اين کار در ++C بسيار مرسوم است. در اينجا در تابع print مشخص شده است که کدام يک از اعضای کلاس بايد چاپ شود، و نيازی به دريافت آرگومان ندارد.

 

 

 

   معرفی کامپيوتروبرنامه نويسی

   ساختارهای کنترلی

   توابع

   آرايه ها

   اشاره گر ها و رشته ها

   کلاسها

   گرانبار کردن عملگر ها

 
 
 
   
 
 
 

حق کپی رایت محفوظ می باشد