تکین وب | آموزش برنامه نویسی
تکین وب | آموزش برنامه نویسی

ترکیب اشیاء در ++C

۲ بهمن ۱۳۹۴

گاهی در شیءگرایی ، می توان از قابلیت اشیاء تو در تو یا ترکیب اشیا استفاده کرد . فرض کنید بخواهیم به طراحی یک کلاس تحت عنوان کلاس employee یا کارمند بپردازیم . یک کارمند می تواند تاریخ استخدام و یا تاریخ تولد داشته باشد . پس به اطلاعاتی مثل سال و ماه و روزی که به عنوان تاریخ استخدام یا تاریخ تولد آن کارمند ثبت شده است ، نیازمندیم :

ممکن است بگویید می توان یک کلاس کارمند طراحی کرد و علاوه بر اطلاعاتی مثل نام و سمت و … کارمند ، همه ی اطلاعاتی که مربوط به تاریخ استخدام یا تولد او نیز می باشد را در private  کلاس و در قسمت public  علاوه بر توابع عضو کلاس کارمند که مربوط به ویژگیهای آن می باشد ، توابعی را مانند set_y , set_m و … و به طور کلی هر آنچه مربوط به کلاس تاریخ یا date بود را تعریف کرد .  این کار شدنی است ولی ممکن است بعدها و با پیچیده شدن کلاس ، حجم کد افزایش یابد و به مشکلاتی برخورد کنیم که مثلا برای تغییر دادن یک قسمت از آن کلاس مجبور باشیم اطلاعات دیگر را نیز تغییر دهیم .( می توانید این کار را امتحان کنید !!)

اما یک راه خوب این است که دو کلاس کارمند و  تاریخ را تعریف کنیم و ویژگی ها و توابع عضو هر کدام را به صورت جداگانه در آن ها قرار دهیم . مثلا کلاس تاریخ با همان ویژگی هایی که در قسمت های قبل آن ها را گفتیم ، باشد و کلاس employee هم اعضایی مثل firstname و lastname و تاریخ استخدام و تاریخ تولد و … باشد . اما این تاریخ استدام و تاریخ تولد به عنوان یک شیء در private کلاس employee تعریف خواهد شد . یعنی می توان به عنوان یک متغیر به آن نگاه کرد که از نوع کلاس date  می باشد. به این ویژگی در ++C ترکیب اشیاء می گویند . درواقع هنگامیکه یک شیء از کلاسی به عنوان اعضای یک کلاس تعریف می شود ، ترکیب به وجود می آید . یک کلاس می تواند اعضایی از سایر کلاس های دیگرداشته باشد .

#ifndef EMPLOYEE_H
#define EMPLOYEE_H

#include<string>
#include "date.h"
using namespace std;
class Employee
{
private :
string fistName;
string lastName;
const date hireDate;// date شیء ثابت از کلاس
const date birthDate;// date شیء ثابت از کلاس  
public :
Employee(const string & , const string & , const date &, const date &);
~Employee();
};
#endif

در این مثال ، کلاس Employee دارای اعضای خصوصی از نوع string برای firstName و lastName و دو شیء ثابت از کلاس date می باشند . این دوشیء از کلاس date خود شامل اعضایی مانند year , month و day می باشند . در قسمت public نیز ،  constructor این کلاس چهار پارامتر را دریافت خواهد کرد . یعنی : (first, last, dateOfBirth, dateOfHire)

برای شفاف شدن موضوع به پیاده سازی constructor این کلاس می پردازیم :

#include<iostream>
#include "Employee.h"
#include "date.h"
using namespace std;
Employee::Employee(const string &first , const string &last ,const date &hireOfDate , const date &birthOfDate)
:firstName(first),
 LastName(last),
 hireDate(hireOfDate),
 birthDate(birthOfDate)
{
//empty body
}

همانطور که ملاحظه می کنید constructor این کلاس چهار پارامتر دارد و چون const هستند باید بعد از علامت : (کولن) مقداردهی اولیه شوند . اگر با نحوه ی مقداردهی اشیاء و متغیرهای ثابت آشنا نیستید به قسمت اشیاء و توابع ثابت در ++C مراجعه نمایید .

نکته ای که وجود دارد این است که در ابتدا باید دو شیء از کلاس date و سپس شیءای را از کلاس employee  ایجاد کنیم . چرا که constructor کلاس employee خود دارای دو شیء از کلاس date است . یعنی قبل از اینکه constructor کلاس employee صدا زده شود ، constructor کلاس date صدا زده شده است :

#include"iostream"
using namespace std;
int main()
{
date birth(1983,05,21);
date hire(2012,07,21);
Employee manager("Bob" , "Jason" , birth , hire);
}

در ابتدا دو شیء از کلاس date ساخته می شود و سپس آن دو شیء به عنوان پارامتر ورودی شیءای از کلاس employee قرار خواهند گرفت .

composition2

نکته ی بعدی این است که به هنگام تخریب اشیاء ، ابتدا destructor اشیاء بیرونی صدا زده می شود (منظور از اشیاء بیرونی اشیایی که در مرحله ی آخر ساخته شده اند و خود دارای اشیاء داخلی هستند ، مثل شیء ای از کلاس employee که خود دارای دوشیء از کلاس date است ) و سپس destructor اشیاء داخلی فراخوانی خواهند شد .

 

در ضمن اگر اینستاگرامی هستید حتما @Takinweb را فالو کنید….

درباره ی عطیه رحمانی

دیدگاه ها

3 دیدگاه ارسال شده !

  1. HSN می‌گه:

    خیلی عالی بود.
    ممنون

  2. negar می‌گه:

    dar tarkib classe mostatil ro ba che mozoi mitavan tarkib kard

دیدگاه خود را به ما بگویید.

کلیه ی حقوق مادی و معنوی مطالب متعلق به سایت تکین وب می باشد و کپی برداری و بازنشر آن بدون ذکر منبع کاری غیر حرفه ای و غیر اخلاقی و قابل پیگرد قانونی خواهد بود.
کانال تلگرام تکین وب