C ++: وظائف عضو ثابت وإعادة تعريف variables- متغير ثابت؟

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

سؤال

وكنت أحاول أن دمج نمط تصميم سينغلتون في قانون بلدي، لكنني بدأت الحصول على خطأ غريب:

main.obj : error LNK2005: "private: static class gameState * gameState::state" (?state@gameState@@0PAV1@A) already defined in gameState.obj

إذا كنت لم تكن مألوفة مع نمط المفرد، ويستخدم أساسا لفرض 1 فقط مثيل لكائن معين في البرنامج بأكمله. هنا هو رمز ذات الصلة: gameState.h:

class gameState
{
public:
static gameState* Instance() {return state;}
.
.
.
private:
gameState();
    static gameState* state;
};
gameState* gameState::state = new gameState();

والآن أنا فقط باستخدام مثيل هذا الكائن في الملف MAIN.CPP:

gameState *currState = gameState::Instance();
.
.
.
for_each(currState->getHumanPieces().begin(),currState->getHumanPieces().end(), drawPieces);

ويبدو اني اسعى الى إعادة تعريف الدولة gameState ::، ولكن لا يمكن معرفة لماذا ... مساعدة أي شخص؟

وأن تحل ذلك، ولكن خطأ واحد لا يزال، وأنا لم ينشئ الواقع قبل حيث اعتقدت أنه كان مجرد جزء من الآخر واحد:

error LNK2019: unresolved external symbol "private: __thiscall gameState::gameState(void)" (??0gameState@@AAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'private: static class gameState * gameState::state''(void)" (??__E?state@gameState@@0PAV1@A@@YAXXZ)

وأي معلومات جيدة حول كيفية إصلاح آن واحد كذلك؟

وبفضل كل واحد منكم، الثابتة: D

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

المحلول

وتحتاج إلى وضع تعريف gameState* ثابت في ملف مصدر واحد بالضبط، أي هذا السطر:

gameState* gameState::state = new gameState();

إذا كنت وضعت في رأس التي يتم تضمينها من قبل ملفات مصدر متعددة، لكل منها تعريف gameState::state الأمر الذي يؤدي إلى أخطاء في الارتباط الوقت.

لمشكلة المتابعة، استخدم Vadakkumpadaths استشارات: تحتاج إلى تقديم تعريف للgameStates منشئ، وليس مجرد إعلان

نصائح أخرى

واضافة تعريف منشئ لإصلاح الخطأ رابط الثاني.

private:
gameState()
{
}

استخدم ماكرو حارس رأس لمشكلة إعادة تعريف وتحديد صراحة منشئ الخاص.

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