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

اسئلة بخصوص الفئات و الثوابت

بدأه C++er في 10 أبريل 2010 · 4 رد · 572 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السؤال بإختصار هو كيف يمكن انشاء constructor لفئه و يتم استدعائه فقط إذا كان الكائن الذى تم إنشائه من هذه الفئه const؟

بمعنى لنفترض ان لدى الفئه X كالتالى

class X
{
public:
    X() : var(0)  {}
    X(int v) : var(0) {}

   // const X(const int v) : cvar(v) {}

    void increment() { ++var; }

private:
   union
   {
      int var;
      const int cvar;
   };
};

كما ترى من الكود السابق يوجد المشيد const X (عبارة عن comment)، اريد عندما يتم انشاء نسخة const من الفئه X ان يتم استدعاء constructor معين خاص بالنسخ الـ const؟ فهل توجد مثل هذه الخاصيه باللغه؟

int main()
{
    const X test(10); // e.g. call const X(const int v) version
}

تعبت من البحث فى الـ standard و على الإنترنت و لم اجد شئ.

السبب وراء بحثى عن هذه النقطه هو تعديل هام فى تصميم الفئه StringA حيث اذا كان الكائن المنشئ منها هو const و كذلك النص الذى تم تمريره لها هو const char* فبالتالى لا داعى من نسخه لمكان اخر حيث بشكل افتراضى المستخدم لا يريد تعديل النص و بالتلى لا حاجه لحجز مساحه اخرى من الذاكره له.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 10 أبريل 2010 في 00:21

مدونتي: C++ Tips and Tricks

#2

الرفع للأهميه!! :unsure:

مدونتي: C++ Tips and Tricks

#3

أخي محمد البرنامج اعلاه لا يضع قيمة للثابت الموجود بداخل الunion وبالتالي سوف يخرج خطأ في GCC النسخة 4.4.0 :

 X.cpp:9: error: uninitialized member 'X::<anonymous union>::cvar' with 'const' type 'const int'

وفي فيجول سي++ 2008 :

error C2758: 'X::cvar' : must be initialized in constructor base/member initializer list

وعند تهيئة المتغيرين في دالة البناء بالشكل :

    X() : var(0),cvar(0) {}
X(int v) : var(0),cvar(v) {}

يخرج خطأ أيضا في GCC هو:

C:\g++ X.cpp -Wall -o x.exe
X.cpp: In constructor 'X::X()':
X.cpp:9: error: initializations for multiple members of 'X::<anonymous union>'
X.cpp: In constructor 'X::X(int)':
X.cpp:10: error: initializations for multiple members of 'X::<anonymous union>'

وفي فيجول سي++ يخرج التحذير:

'X::cvar' has already been initialized by another union member in the initializer list, 'X::<unnamed-tag>::X::var'

اضافة الى أنه لا يمكن عمل overload في دالة البناء باضافة const .

هذه الحالة التي لديك غريبة وأعتقد أن وجود const في الunion غير منطقي وحتى لو سمح المترجم بذلك.

والله أعلم ،

بالتوفيق،

تم تعديل هذه المشاركة بواسطة Wajdy Essam في 10 أبريل 2010 في 15:39

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

#4

سبحان الله، جربتهم امس على مترجم ميكروسوفت (امتدادت اللغه غير مفعله) و مترجم intel و لم يظهر الخطأ مع انى اعتقدت انه يوجد خطأ لوجود ثابت لم يتم عمل intializing له.

اقتباس
اضافة الى أنه لا يمكن عمل overload في دالة البناء باضافة const .

اى المشيدان تقصد الذى يسبقه const (هذا لن يعمل بشكل افتراضى) ام الأخر الذى يحتوى على المعامل المعرف بـ const ؟

اقتباس
هذه الحالة التي لديك غريبة وأعتقد أن وجود const في الunion غير منطقي وحتى لو سمح المترجم بذلك.

لا الكود بالأعلى لا وجود له، و لكنى صنعته لتقريب الفكره وهى انى اريد عمل مشيد يتم استدعائه عندما يتم انشاء كائن من الفئه و يكون هذا الكائن const.

اقتباس
سوف يخرج خطأ في GCC النسخة 4.4.0

انا فعلا بحاجه لإستخدام المترجم GCC على ويندوز و لينوكس و ماك و لكنى لا اعرف طريقة اعداده فأرجو ان ترشدنى لهم ان امكن.

شكرا لك اخى وجدى.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 10 أبريل 2010 في 16:31

مدونتي: C++ Tips and Tricks

#5
اقتباس
اى المشيدان تقصد الذى يسبقه const (هذا لن يعمل بشكل افتراضى) ام الأخر الذى يحتوى على المعامل المعرف بـ const ؟

كنت أتحدث عن الدالة التي يوجد بها تعليق :

// const X(const int v) : cvar(v) {}

فوجود const قبل الدالة يكون خطأ لغوي syntax error .

أما لو ازلنا const الموجودة قبل الدالة فلن تعمل أيضا والسبب أنه توجد دالة بناء أخرى تستقبل عدد صحيح (ووجود الconst كمعامل مع اي من الNon-Reference Parameter يجعله Redeclaration وليس Overloading ).

اقتباس
و لكنى صنعته لتقريب الفكره وهى انى اريد عمل مشيد يتم استدعائه عندما يتم انشاء كائن من الفئه و يكون هذا الكائن const.

هل يوجد في الكلاس union ؟ فاذا كان يوجد فيه ويحتوي على ثابت فأعتقد أن يجب تغيير ذلك التصميم . لأنه يوجد فقط متغير واحد فعال في اللحظة عند استخدام الUnion ، ووجود const فيه يتطلب تهئيته في دالة البناء مباشره ولن تستطيع اعطائه قيمه بعد استخدام المتغير الأخر.

بالنسبة لGCC فأنا أستخدم الporting له وليس الخاص بنسخه اليونكس ( استخدم MinGW) .. أذا أردت استخدام الGCC يجب تحميل cygwin لم استخدمه مسبقا ولكني أكتفي بالMinGW ولا أظن هناك فروقات بينهم .

تنصيب MinGW بسيط فعند تحميل النسخه online ونتنظر الى ان يقوم بالتحميل من الموقع ، ستجده في القرص C ، ستقوم بعدها اذا أردت بوضع مسار المجلد bin في الenvironment variable حتى تستطيع استخدامه من اي مكان .

بالتوفيق،

1

http://informatic-ar.com منصة تعليمية عربية في علوم الحاسب والبرمجة

https://moalfat.com  للكتب الالكترونية والكورسات التعليمية

Everything we see now is just an engineering solution based on old science

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