AudaNix

[درس] 8.9.كود الفئة والملفات الرأسية

1 مشاركة في هذا الموضوع

كود الفئة والملفات الرأسية

Class code and header files

تعريف الدوال اﻻعضاء خارج كود تعريف الفئة Defining member functions outside the class definition

كل الفئات التى تناولنها سابقا كانت بسيطة وكنا ندمج كود تطوير الدوال داخل تعريف الفئة مباشرا على سبيل المثال الفئة Date السابق عرضها:


class Date
{
private:
int m_nMonth;
int m_nDay;
int m_nYear;

Date() { } // private default constructor

public:
Date(int nMonth, int nDay, int nYear)
{
SetDate(nMonth, nDay, nYear);
}

void SetDate(int nMonth, int nDay, int nYear)
{
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}

int GetMonth() { return m_nMonth; }
int GetDay() { return m_nDay; }
int GetYear() { return m_nYear; }
};

وعلى الرغم من سهول الموضوع اﻻ عندما يكبر حجم الفئة وتصبح اكثر تشعبا فأن علمية دمج كود التطوير implementation مع كود تعريف الفئة تجعل من الصعب ادارتها والعمل بها. بشكل عام عندما تنظر الى تعريف فئة class definition (مثل الذي كتبناة سابقا) أنت ﻻتهتم كيف تم تطوير هذة الفئة انت تريد فقط أن تعرف كيف تستخدم هذة الفئة فقط انت تهتم بجزء تعريف الفئة ﻻ غير وان كل تفاصيل التطوير ﻻتعير لها اهتماما.

لحظ الحظ فأن سي++ تمدنا بطريق لفصل جزء تعريف الفئة عن جزء تطويرها يتم ذلك بتعريف دوال أعضاء الفئة خارج تعريف الفئة. بكل بساطة كما تعمل فى تعريف الدوال العادية لكن قم بأضافة اسم الفئة ثم مؤثر دقة الوصول فى الفئة (::) قبل اسم الدالة العضو.

التالى هو فئة Date بدالة بناء Date ودالة SetDate() تم تعريفهما خارج تعريف الفئة. ﻻحظ ان نموذج تعريف الدوال prototypes يظل كما هو بداخل تعريف الفئة. لكن كود تطوير الدالة العضو تم نقلة خارج تعرف الفئة:

class Date
{
private:
int m_nMonth;
int m_nDay;
int m_nYear;

Date() { } // دالة بناء افتراضية خاصة private

public:
Date(int nMonth, int nDay, int nYear);

void SetDate(int nMonth, int nDay, int nYear);

int GetMonth() { return m_nMonth; }
int GetDay() { return m_nDay; }
int GetYear() { return m_nYear; }
};

// دالة بناء الفئة Date
Date::Date(int nMonth, int nDay, int nYear)
{
SetDate(nMonth, nDay, nYear);
}

// دالة عضو فى الفئة Date
void Date::SetDate(int nMonth, int nDay, int nYear)
{
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}

يتعتبر هذا الكود سهل وبسيط للغاية ﻻن دالة الوصول مكونة من سطر واحد فى الحاﻻت البسيطة مثل هذة ممكن نترك كود تطوير الدالة العضو داخل كود تعريف الفئة لكن اذا كان حجم اصبح كبيرا فلابد من الفصل مثال آخر:

class Calc
{
private:
int m_nValue;

public:
Calc() { m_nValue = 0; }

void Add(int nValue) { m_nValue += nValue; }
void Sub(int nValue) { m_nValue -= nValue; }
void Mult(int nValue) { m_nValue *= nValue; }

int GetValue() { return m_nValue; }
};

يصبح:

class Calc
{
private:
int m_nValue;

public:
Calc() { m_nValue = 0; }

void Add(int nValue);
void Sub(int nValue);
void Mult(int nValue);

int GetValue() { return m_nValue; }
};

void Calc::Add(int nValue)
{
m_nValue += nValue;
}

void Calc::Sub(int nValue)
{
m_nValue -= nValue;
}

void Calc::Mult(int nValue)
{
m_nValue *= nValue;
}

فى هذة الحالة نحن تركنا دالة البناء اﻻفتراضية داخل الفئة ﻻننها صغيرة .

أضافة كود تعريف الفئة داخل ملف رأسي Putting class definitions in a header file

عند دراستك للأساسيات سي++ تعلمت يمكن اضافة الدوال فى الملفات الرأسية لكي تعيد استخدمها فى اكثر من مشروع او ملف آخر. والفئات يمكن عملها بهذة الطريقة ايضا. يمكن وضع تعريف الفئة فى ملف رأسي لكي نسهل علمية اعادة استخدامة مرة اخري فى مشروعات وملفات مختلفة . عادة يوضع كود تعريف الفئة فى ملف رأسي بأسم نفس أسم الفئة وباﻻمتداد *.h ، ويتم تعريف الدوال اﻻعضاء خارج ملف تعريف الفئة بنفس اﻻسم ولكن بأمتداد *.cpp

التالي فئة Date الجميلة مرة اخري مقسم الى ملف .cpp وملف .h :

Date.h:

#ifndef DATE_H
#define DATE_H

class Date
{
private:
int m_nMonth;
int m_nDay;
int m_nYear;

Date() { } // private default constructor

public:
Date(int nMonth, int nDay, int nYear);

void SetDate(int nMonth, int nDay, int nYear);

int GetMonth() { return m_nMonth; }
int GetDay() { return m_nDay; }
int GetYear() { return m_nYear; }
};

#endif

Date.cpp:

#include "Date.h"

// Date constructor
Date::Date(int nMonth, int nDay, int nYear)
{
SetDate(nMonth, nDay, nYear);
}

// Date member function
void Date::SetDate(int nMonth, int nDay, int nYear)
{
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}

اﻵن اى ملفات او مشروعات اخري تريد استخدام الفئة Date بكل بساطة تكتب الجملة التالية فى بداية الملف او ملف المشروع: #include "Date.h" . ﻻحظ ان Date.cpp يحتاج الى ترجمة داخل اى مشروع يستخدم date.h وايضا الرابط linker يعرف كيف تم تطوير الفئة Date .

فى الدروس التالية اغلب الفئات سوف يتم تعريفها فى ملف .cpp وكل الفئات الدوال اﻻعضاء يتم كتابة كود تطويرها مباشرا فى كود تعريف الفئة. هذا فقط لتبسيط اﻻكود وجعلها قصيرة لسهولة القراءة والتطبيق. طبعا فى المشروعات الكبيرة الحقيقة يتم فصل كود تعريف الفئة عن كود تطويرها وقد تجد نفسك تتعامل مع 30 ملف فى نفس الوقت ... .

تم تعديل بواسطه محمد عودة
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .