ج ++: منشئ الخاص يعني عدم وجود تعريف هذه الطبقات كائنات رؤوس الداخل؟

StackOverflow https://stackoverflow.com/questions/1817599

سؤال

ولكن سؤال آخر، انتقل لي! ... على أي حال، لقد 2 الطبقات مع منشئات خاصة وظائف ثابتة للعودة مثيل من تلك الفئة. كان كل شيء بخير، لدي ملف MAIN.CPP حيث تمكنت من الحصول على عقد من بلدي gameState مؤشر كائن، عن طريق القيام:

gameState *state = gameState::Instance();

ولكن الآن يبدو لي أن لديك مشكلة. من أجل الراحة، كنت أريد المقام gameState ومثيل actionHandler الاحتفاظ بنسخة من المؤشر إلى بعضها البعض. لذلك حاولت أن تدرج في الملفات رأس كل منهما:

gameState *state;

و

actionHandler *handler;

ولكن هذا لا يبدو للعمل ... أحصل على "خطأ C2143: خطأ في بناء الجملة: مفقودة '؛' قبل "أخطاء '* على كل من تلك الخطوط ... هل يمكن أن لا تحديد متغيرات في كلاسي معين في رأس إذا تلك الفئة لديها منشئ الخاص؟ أو هو شيء مشكلة آخر؟ أو ربما هو ليتم تخزينها المؤشر إلى تيه سبيل المثال كعضو ثابت؟

وتحرير: شكرا لكم أيها الرجال! إنه لأمر مدهش كمية ج ++ المعرفة انني اتلقى هذه اليومين الماضيين .. أوسم!

هل كانت مفيدة؟

المحلول

ويبدو أنك بحاجة إلى إضافة إعلان إلى الأمام من الطبقة المعاكس إلى ملف رأس كل فئة ل. على سبيل المثال:

class actionHandler;

class gameState
{
private:
    actionHandler *handler;

    ...
};

وو:

class gameState;

class actionHandler
{
private:
    gameState *state;

    ...
};

نصائح أخرى

وانها ليست لمنشئ الخاص.

و، ذلك لأن لديك تبعية دائرية. وذلك عند محاولة ترجمة فئة A، تحتاج إلى ترجمة من الدرجة B، الذي يحتاج جمعت الدرجة A، وهلم جرا.

وحاول إعلان إلى الأمام.

في ملف الرأس حيث يتم تعريف gameState

class actionHandler;

والمشكلة لا علاقة لها منشئات خاصة لا شيء. في وحدة معينة الترجمة (ملف .cpp وجميع الملفات الموجودة. ح)، لا تعترف مترجم C ++ المعرف لفئة حتى يتم تعريف الطبقة. وهذا يطرح مشكلة عندما تحتوي على فئتين من الأعضاء التي تشير إلى بعضها البعض. ويطلق على حل "إعلان إلى الأمام"، الذي هو مجرد اسم الفئة، ولكن لا الجسم. قد يبدو شيئا من هذا القبيل في قضيتك:

و== == gameState.h

...
// Note no #include for "actionHandler.h" (but there would be in gameState.cpp)

class actionHandler;

class gameState
{
  actionHandler *handler;
  ...
};
...

و== == actionHandler.h

...
#include "gameState.h"

// No forward declaration needed.

class actionHandler
{
  gameState* state;
  ...
};
...
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top