الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ما معنى هذا الشيء ؟؟ بالفعل أنه غريب !! :)

مغلق
بدأه me في 8 أغسطس 2001 · 4 رد · 554 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عند تصميم لمحرك قواعد البيانات حقي واجهت أني عندما عرفت كلاسين tow classes واحد منهم يستخدم الثاني مثلا :

(طبعا جميع الأكواد مختصرة وليست كامله)

class a
{
public:
   a();
   ~a();
private:
   b temp; //التركيز هنا (على هذه النقطة)
}

class b
{
public:
   b();
   ~b();
}

الناتج : error ليش ؟؟ لأن الكلاس a عرف قبل الكلاس b ومادام الكلاس a يستخدم كلاس b صار هذا الإرور ..... زين لو أنا بغيت برنامجي بترتيب معين وش أسوي هذي حاجة والحاجة الثانية لو جى الكود بهذه الطريقه:

class a
{
public:
   a();
   ~a();
private:
   b temp;
}

class b
{
public:
   b();
   ~b();
private:
   a temp; //هنا الفرق
}

وش رايح؟؟

الناتج: أشتغل البرنامج وما في أي مشكلة رم إن الكلاس الأول معرف قبل الكلاس الثاني ويستخدمه ؟؟!!

كيف أتفادى هذه المشكلة (يعني كيف أقدر أكتب نفس الكود الأول وبنفس الترتيب بدون ما يحصل error ؟؟ وشكرا

آه في حاجة ما الفرق بين كتابة:

class a
{
... //باقي الكود (أختصارا)
}

وبين :
class a;//هنا الفرق
class a
{
... //(أختصارا)
}
 ؟؟؟

مهند،15 سنة،thestrangersoul@yahoo.com

#2

بسم الله الرحمن الرحيم

الأخ مهند

حسب معلوماتي إن اللي انت تاحول اتسويه مجرد ضرب من الجنون .

ليه ؟

الأن دعنا نتخيل مالذي سيفعله الكومبايلر لشفرة مثل هذه لو كانت صحيحة :

class Class1
{
   Class2 A;
};

class Class2
{
   Class1 A;
};

void main()
{
   Class1 A;
}

الآن سنحاول كتابة الكود السابق بشكل تعليمات كلامية :

ابدأ الوظيفة main

أنشأ متحولا من نوع Class1

>>>> عملية إنشاء Class1:

أنشئ متحول عضو من نوع Class2

>>> عملية إنشاء Class2 :

أنشئ متحول من نوع Class1

>>> عملية إنشاء Class1

أنشئ متحول من نوع Class2

>>> عملية إنشاء Class2 :

أنشئ متحول من نوع Class1

----------------------------

وتستمر العملية بدون نهاية ولذلك لا توجد طريقة لتصميم هذا النوع من الفئات في ++C ، وأما بالنسبة لاستخدام البروتايب للفئات مثل الوظائف ففي الحقيقة هذه أول مرة أدري إنه يمكن تصميم بورتايب لفئة ، ولكن لو تلاحظ بأنه عديم الجدوى نهائيا انظر إلى هذا الكود المعقول ولكن لايمكن كتابه في ++C :

class test;

void main()
{
   test A;
}

class test
{
public:
   test() { cout << "testn";}
};

والله أعلم إن كان هناك سببا لوجود بروتايب للكلاس .

وبعدين ليش ما تسأل أخوك محمد هو دارس ++C ؟ أوووووه لا يكون زهقته وطفش منك ؟؟!! إيييه اتسويها أنا أعرفك آآآآآآخ منك .

أخوك ،

#3

أخواني ،

لا يمكن فعل الذي ذكرته ياأخي مهند بأي طريقة .. وذلك لأن السي++ يجب أن تعرف حجم المتحول الذي سوف يأخذه في الذاكرة وذلك من أجل بناء شجرة المتحولات ضمنيا ومعرفة ازاحاتها .

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

يمكن أن تتم تعريف متحول إلى مؤشر إلى كلاس وهذا الكلاس معرف لاحقا في البرنامج وذلك بشرط أن يتم كتابة prototype للكلاس . والبروتوتايب وظيفتها ان تخير المترجم بأن هذا المتحول هو كلاس وسوف نقوم بتعريفه لاحقا في البرنامج . وقد قبل المترجم هذا لأن حجم المؤشر معرووف وهو أربع بايتات (في الأجهزة ذات عنونة 32بت)..

أي على حسب المثال التالي :

class CLater;

class CMyPoint
{
    CLater *m_pLater;   
}

class CLater
{
    int m_nX;
    int m_nY;
    CMyPoint m_ptCenter;
}

حتى أن الكود السابق لا يمكنك أن تعمل new و delete للمتحول m_pLater في الباني والهادم ضمنيا داخل الكلاس . ولكن يجب تأخير ذلك حتى يتم تعريف CLater ..

فيفضل أخي أنو لا تعقد حالك كثير بل حاول أن تبني ال Classes تبعت البرنامج بشكل مظبوط ومنطقي وكل شي بعدها بهون .. :)

Coding on the Cloud and for the Cloud!

My Blog

#4

السلام عليكم.

أخي هاني أعتقد أن طريقة التصريح التي كتبتها يمكن استخدامها في بعض الحالات و هي عندما نريد تطبيق مفهوم اللوائح المترابطة Linked Lists و خصوصا هناك حالات معقدة فيها أعتقد أنها لا تظبط إلا إذا استخدمنا الطريقة التي كتبتها.

مع التحيات.

#5

شكرا وبس :):)

هذا الموضوع مغلق.

مواضيع مشابهة