C++ الطبقات المتداخلة إلى الأمام إعلان خطأ
-
10-07-2019 - |
سؤال
أنا أحاول أن تعلن استخدام فئة ب داخل فئة A
وتحديد ب خارج A.
أنا أعرف حقيقة أن هذا ممكن لأن Bjarne Stroustrup
يستخدم هذا في كتابه "C++ لغة البرمجة"
(صفحة 293 ، على سبيل المثال سلسلة Srep الطبقات).
لذلك هذا هو بلدي الحد الأدنى قطعة من التعليمات البرمجية التي تسبب مشاكل
class A{
struct B; // forward declaration
B* c;
A() { c->i; }
};
struct A::B {
/*
* we define struct B like this becuase it
* was first declared in the namespace A
*/
int i;
};
int main() {
}
هذا القانون يعطي التالية تجميع الأخطاء في g++ :
tst.cpp: In constructor ‘A::A()’:
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’
tst.cpp:3: error: forward declaration of ‘struct A::B’
حاولت البحث في C++ التعليمات و closeset حصلت هنا و هنا ولكن
هذه لا تنطبق على حالتي.
أنا أيضا قراءة هذا من هنا ولكن هذا ليس حل مشكلتي.
كل دول مجلس التعاون الخليجي و MSVC 2005 تعطي أخطاء برنامج التحويل البرمجي على هذا
المحلول
وتعريف منشئ لوبعد تعريف البنية B.
نصائح أخرى
ووc->i
التعبير dereferences المؤشر إلى struct A::B
ذلك تعريفا كاملا يجب أن تكون واضحة في هذه المرحلة من البرنامج.
وأبسط الإصلاح هو جعل منشئ A
غير مضمنة وتوفير الجسم لذلك بعد defintion من struct A::B
.
وهذا هو مثال جيد لماذا كنت تريد أن تبقي تعريفات منفصلة عن الإعلانات. كنت بحاجة إلى تغيير ترتيب الأمور بحيث يتم تعريف A::A()
منشئ بعد تعريف struct A::B
.
class A
{
struct B;
B* c;
A();
};
struct A::B
{
int i;
};
A::A() { c->i; }
int main()
{
return 0;
}
ومن المثير للاهتمام, لقد اصطدم نفس المشكلة مع الصفحة 293 ('11.12 فئة سلسلة') المذكورة في Stroustrup الكتاب.
في المثال الوارد في الكتاب المطبوع يبدو أن يكون على خطأ ، وتوفير الطرق التالية مضمنة بدلا من تحديد لهم بعد تعريف البنية Srep
class String {
// ...
void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); }
char read(int i) const { return rep->s[i]; }
void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; }
...etc...
لقد بحثت قليلا ووجدت صاحب البلاغ أحدث تنفيذ هذه السلسلة فئة متوفرة هنا: http://www2.research.att.com/~bs/string_example.ج
وقال انه يبدو انه قد تم تعديلها من ذلك أن هذه الأساليب لم تعد مضمنة ، لتجنب المشكلة المذكورة في هذا الموضوع.