1

私はしばらくの間、解決策を見つけようとして頭を悩ませてきました。静的ポインターを持つクラスから継承したいのですが、エラー LNK2001: unresolved external symbol "protected: static class cGame * cEvent::mGame" (?mGame@cEvent@@1PAVcGame@@A) が発生します

最適には、クラス cEvent を 1 回だけ初期化してから、継承されたクラスにポインタを渡さないようにします。

#ifndef EVENT_H
#define EVENT_H

#include "game.h"


class cEvent
{
protected:
    static cGame* mGame;
public:
    cEvent(){;}
    virtual void doEvent(){;}
};

class cEventExitButton: public cEvent
{
private:
public:
    cEventExitButton(cGame *g){mGame = g;}
    void doEvent(){mGame->getWindow()->close();}
};

#endif
4

3 に答える 3

5

クラスでメンバーを定義する必要があります。static

##include "game.h"

//do this .cpp file

cGame* cEvent::mGame = nullptr;

//or initialize it as : cGame* cEvent::mGame = create object!

クラスの静的メンバーは宣言のみであり、定義ではないことに注意してください。

于 2013-01-05T21:59:58.733 に答える
1

mGameヘッダーファイルでのみ宣言しました:

static cGame* mGame;

これは、コンパイラにmGame存在するものとその型を伝えますが、実際には存在するためのスペースを作成しませんmGame。このためには、cpp ファイルで定義する必要があります。

cGame* cEvent::mGame = [some intial value];

これで、リンカーには場所がmGameあり、それを参照する人は誰でもその場所を指すことができます。複数のファイルにヘッダーが含まれている可能性があるため、リンカーはヘッダーでこれを行うことはできません。ただし、必要な場所は 1 つだけmGameなので、cpp ファイルに入れる必要があります。

于 2013-01-05T22:04:12.160 に答える
0

ファイルで定義する必要がmGameあり.cppます:

cGame* cEvent::mGame = ...;

...(適宜置き換えてください。)

于 2013-01-05T22:00:42.947 に答える