• 0
A.S Hack

سؤال لتحريك الأذهان

سؤال

السلام عليكم::

لنفرض أن لدينا الفصيلة - الصنف – التالي باسم a :

class a{
public:
a();
};

ولدينا فصيلة أخرى باسم b :

class b{
public:
b (const a& t);
};

وكتبنا في الدالة main بهذا الشكل:

int main(){

a b( a() );
return 0;

}

من يستطيع أن يخبرنا -يصف- ما هو هذا السطر بالتحديد:

a b( a() );

smile.gif

2

شارك هذا الرد


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

4 إجابة على هذا السؤال .

  • 0

يتم استدعاء ال Copy Constructor الخاص بالفئة a

ولا دخل للفئة b فى الموضوع

1

شارك هذا الرد


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

عبارة عن declaration لدالة اسمها b و تعيد كائن من نوع a. أما عن الـ parameters لهذه الدالة فهي عبارة عن دالة أيضاً, تعيد كائن من نوع a و لا تستقبل parameters :)

يسمى هذا الـ most vexing parse لأن هناك ambiguity في تفسير هذا السطر, و المواصفات القياسية تحدد التفسير المذكور على أنه التفسير القياسي.

1

شارك هذا الرد


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

السلام عليكم

أعتقد أنه تمت الإجابة على السؤال .. لكن من باب الفائدة العامة أود أن أنوه أن طريقة كتابة السطر التالي :

a b( a() );

قريبة إلى حد ما من الــ Coplien Form :)

الشكل القانوني لفئات Coplien يكون هكذا :

class A {
public:
A();
A(const A&);
~A();
A &operator=(const A&);
};

و عندما نكتب :

A a;
A b(a);

فهذا يعني إنشاء كائن b من A مع تمرير الكائن a للــ Copy Constructor.

0

شارك هذا الرد


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

جميلة مداخلات الأحبة،

كما ذكر أخونا خالد، هذا يسمى التحليل الأكثر إرباكا أو كما يسميه أهل العُجمة most vexing parse، مثل هذه التعابير تختلط فيها البُنى التركيبية النحوية في اللغة مما يؤدي لغموض ambiguity عند محاولة تحليله، ما جعل الإشارة لمثل هذه التعابير في معايير اللغة لازماً.

والحقيقة أن ما ذُكر في المعايير في هذا الشأن هو مخالف لما يتوقعه أغلب المبرمجين، فأغلبهم يفسر السطر على أنه تعريف لكائن b من النوع a.

لا أحد يُلام على مثل هذا التفسير، لأن عدد من المُصرّفات العتيقة لا تزال تفهم السطر على أنه تعريف لكائن. أما معايير اللغة القياسية تقول بالقول الذي ذكره أخونا خالد في رده. أي تصريح لدالة بإسم b تعيد كائن من النوع a .

تُبرمج المصرفات -التي تتبع المعايير- على قاعدة تُسمى favor declaration تقول هذه القاعدة أنه حينما يكون هنالك statement يُمكن أن تُفسر على أنها تصريح declaration أو أي شيء آخر مثل definition ، يتم التفسير على أن التعبير هو declaration .

وبالعموم وردءً لأي لبس – على مستوى التفسير البشري -، يكون أفضل تعامل مع مثل هذه الأمور يرجع للمبرمج نفسه، وأفضل ما يمكن أن يقوم به في مثل التعبير السابق هو التالي:

a b( (a()) ); // b هو كائن

a b( a(*)() ); // b هو دالة

لاحظو الـwarning الجميل الذي أعطاه مصرّف MS VS 2010 لدالة main كتب فيها تصريح "الدالة" الأخيرة:

Warning 1 'a b(a (__cdecl *)(void))': prototyped function not called (was a variable definition intended?)

لمزيد بيان، يمكن القراءة عن الـمواضيع المتعلقة التالية tokenizer وقاعدة maximal munch و syntactic analysis.

أخي khaled.Alshaya أرسلت لك على الخاص، لعلك تجبني :) .

تم تعديل بواسطه A.S Hack
1

شارك هذا الرد


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

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

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

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