سؤال

أنا أحاول أن تعلن استخدام فئة ب داخل فئة 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.ج

وقال انه يبدو انه قد تم تعديلها من ذلك أن هذه الأساليب لم تعد مضمنة ، لتجنب المشكلة المذكورة في هذا الموضوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top