سؤال

هل من الممكن أن يتم إرسال فئة متداخلة إلى الأمام ، ثم استخدامها كنوع لخسارة (وليس مؤشر إلى/إشارة إلى) عضو البيانات في الفئة الخارجية؟

بمعنى آخر

class Outer;

class Outer::MaybeThisWay   // Error: Outer is undefined
{
};

class Outer
{
 MaybeThisWay x;

 class MaybeThatOtherWay;

 MaybeThatOtherWay y;   // Error: MaybeThatOtherWay is undefined
};
هل كانت مفيدة؟

المحلول

لا يمكنك النشر إلى الأمام فئة متداخلة من هذا القبيل.

اعتمادًا على ما تحاول القيام به ، ربما يمكنك استخدام مساحة الاسم بدلاً من فصل على الطبقة الخارجية. يمكنك النشر إلى الأمام مثل هذا الفصل لا مشكلة:

namespace Outer {
   struct Inner; 
};

Outer::Inner* sweets;  // Outer::Inner is incomplete so 
                       // I can only make a pointer to it

إذا كان يجب أن يكون الخارجي على الإطلاق فئة ، ولا يمكنك أن تحضره في مساحة اسم ، فستحتاج إلى أن يكون الخارجي نوعًا كاملاً في السياق الذي تعلن فيه إلى الأمام الداخلي.

class Outer
{
   class Inner;  // Inner forward-declared
};  // Outer is fully-defined now

Outer yes;  // Outer is complete, you can make instances of it
Outer::Inner* fun;  // Inner is incomplete, you can only make 
                    // pointers/references to it

class Outer::Inner 
{
};  // now Inner is fully-defined too

Outer::Inner win;  // Now I can make instances of Inner too

نصائح أخرى

لا توجد وسيلة لإعادة نشر فئة متداخلة دون تحديد الفئة المحتوية بالكامل. هذه الخدعة الصغيرة تعمل على إصلاح المشكلة رغم ذلك

class Outer_Inner
{
};

class Outer
{
public:
   typedef Outer_Inner Inner;
};

هذا يعمل بالنسبة لي كما في اتفاقية التسمية الخاصة بي Outer_Inner ليس اسم فئة صالح ، لذلك من الواضح أنه يشير إلى فئة متداخلة.

ما زلت لا تستطيع أن تعلن عن الفصل المتداخل مثل هذا:

class Outer::Inner;

ولكن على الأقل يمكن إعلانه مع:

class Outer_Inner;

إذا كنت لا تحب الطريقة التي يبدو بها Outer_inner ، فيمكنك تبني اتفاقية تسمية للفصول المتداخلة التي تناسب أذواقك بشكل أفضل. Outer__Inner, Outer_nested_Inner, ، إلخ.

لا ، ولكن ما الخطأ في

class Outer {
public:  //or protected or private
    class Inner {
    };

private:
    Inner foo;
};

الإعلان إلى الأمام لا يكون من المنطقي هنا ، إلا إذا فقدت شيئًا ما (وهو ما يمكن رؤية أن سؤالك يفتقر إلى الكثير من التفاصيل)

تذكر أنه إذا تم إعلان الفصل إلى الأمام ، فيمكنك فقط إعلان الإشارات إلى أو مؤشرات إلى كائن من النوع المعلن إلى الأمام. لا يمكنك فعل أي شيء آخر معه ، بما في ذلك الوصول إلى أعضائه أو وظائفه.

إذا كان الفصل معلنًا إلى الأمام (لكن ليس لديك التعريف الكامل حتى الآن) ، فيمكنك فقط إعلان مؤشر له ، لأن المترجم لا يعرف بعد حجم الفصل (ولا أسماء حقوله أو الطرق).

إذا أعلنت سمة من النوع MaybeThatOtherWay, ، ليس مرجعًا ولا مؤشرًا ، يجب أن يعرف المترجم التعريف الكامل للفئة لتحديد حجم الفئة الخارجية. وبالتالي ، لا يمكنك استخدام الإعلان إلى الأمام وهذا النوع من الإعلان الميداني ، سواء كان فئة متداخلة أم لا.

إذا كنت بحاجة فقط إلى نوع كمعلمة دالة أو متغير ثابت ، فقد يتم ذلك على جانب العميل. على سبيل المثال ، لتلقي إشعار الحدث من الخارج:

واجهه المستخدم:

class Client {
public:
private:
    static void gotIt(int event);
    class Helper;
};

التنفيذ:

#include <outer.hpp>

class Client::Helper {
public:
    static void fromOuter(Outer::Inner const& inner) 
    { 
        gotIt(inner.event());
    }
};
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top