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

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

بدأه A.S Hack في 27 نوفمبر 2012 · 4 رد · 1,284 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لنفرض أن لدينا الفصيلة - الصنف – التالي باسم 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

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#2

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

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

1


﴿وَمَا كَانَ اللَّهُ لِيُعَذِّبَهُمْ وَأَنْتَ فِيهِمْ ۚ وَمَا كَانَ اللَّهُ مُعَذِّبَهُمْ وَهُمْ يَسْتَغْفِرُونَ﴾

الأنفال ۳۳                                  
 

#3

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

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

1
#4

السلام عليكم

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

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.

#5

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

كما ذكر أخونا خالد، هذا يسمى التحليل الأكثر إرباكا أو كما يسميه أهل العُجمة 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 في 28 نوفمبر 2012 في 20:47

1

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…