0

わかりました、これは非常に奇妙です...私は思います。タイトルの意味は次のとおりです。

私が持っているactionHandlerオブジェクトのact()関数内:

state->getHumanPieces();

これにより、ある種のアドレス違反が発生します。明らかに、「this」には「state」変数が初期化されていません...このactionHandlerクラスには、「handler」と呼ばれるそれ自体のインスタンスへのポインターである静的変数があります。 '...そして私がそうするなら:

handler->state->getHumanPieces();

それは完璧に機能します..これをさらに明確にするために:

その「ハンドラー」ポインターは、プログラム全体に存在するactionHandlerの唯一のインスタンス(シングルトンパターン)を指します。したがって、基本的に、actionHandlerオブジェクトからこのact()関数を実行すると、「状態」にアクセスできません。変数、しかしそのオブジェクトから、同じオブジェクトへのポインタを介して同じ変数にアクセスしようとすると、それは大丈夫ですか?何が起こっているのかわかりません。それが明確かどうかはわかりませんが、少し混乱する可能性がありますが、理解できることを願っています。

ところで、VS08デバッガーは私が何を意味するかを示しています:

this: 0x000000 {state=???}
   handler: someAddress {state= someAddress}
      handler:...
      state:...
state:  CXX0030: ERROR:  expression cannot be evaluated

それがより明確になることを願っています。変数の現在の値が表示される小さなウィンドウに表示されるのは小さなツリー構造です(自動)。

編集:このポインタがnullになるので、nullになる方法がわかりません。コードを投稿します。

actionHandler.h:

class gameState;

class actionHandler
{ 
public:
        static actionHandler* Instance(){return handler;}
    void act(int,int);
private:
    actionHandler();
    static actionHandler* handler;
    gameState *state;
};

actionHandler.cpp:

actionHandler* actionHandler::handler = new actionHandler();

actionHandler::actionHandler()
{
        state = gameState::Instance();
}
void actionHandler::act(int x, int y)
{
    state->getHumanPieces();
}

現在、gameState.hiには、同様の構造(シングルトン)とactionHandler *プライベート変数があり、次の場所で初期化されます。

gameState::gameState()
{
    handler = actionHandler::Instance();
}

また、ハンドラーを返すgetHandler()関数もあります。これはすべてmain.cppで初期化する必要があります。

gameState *currState = gameState::Instance();
actionHandler *handler = currState->getHandler();

そして使用されます:

handler->act(event->button.x,event->button.y);

main.cppは、ヘッダーのない単純な.cスタイルで記述されているため、ハンドラーを呼び出す関数は静的であると思います...ただし、gameState *ポインターも呼び出します。これは、おそらくまったく同じように機能します。 actionHandler *one..これがより明確になることを願っています。

4

4 に答える 4

1

ポインタthisがnullです。

このようなことが起こっています:

actionHandler* actObj = 0;
actObj->act(); // ERROR access violation
于 2009-11-30T04:22:35.930 に答える
1

ここで説明する静的初期化順序の大失敗の場合のように見えます。両方の静的オブジェクトコンストラクターは、非常に奇妙な循環的な方法で相互に依存しています。

于 2009-11-30T10:36:43.817 に答える
0

actionHandler呼び出しact()ているオブジェクトが初期化されていることを確認してください。ポインタact()で呼び出されているように見えます。null

于 2009-11-30T04:20:17.750 に答える
0

actionHandler()またはact()メソッドは静的ですか?

その場合、静的メソッドはオブジェクトの特定のインスタンスから呼び出されないため、このポインタがNULLになるのは完全に正常です。

たとえば、次のようなオブジェクトを考えてみましょう。

class CThing
{
public:
    static void actionHandler();
    void act();
protected:
    static CThing* handler;
    CState state;
}

CThing :: actionHandler()の関数ポインタがサードパーティのクラスに渡されて通知を受け取る場合、このクラスがCThing :: actionHandler()メソッドを呼び出して通知するとき(:を呼び出すことCThing::actionHandler();によってptrThing->actionHandler()。 actionHandlerメソッドは静的ではありませんでした)。このポインターがなく、現在のオブジェクトがないため、actionHandler内からthisポインターまたは状態変数(またはactionHandler内から行われる後続の呼び出し)にアクセスすることはできません。

これがhandler->state->getHumanPieces()機能する理由です。これは、クラス定義自体ではなく、実際にはCThingクラス(ハンドラー)のインスタンスを参照しているためです。

私は十分に明確であったことを願っています...そうでない場合は、遠慮なく精度を求めてください。

于 2009-11-30T05:23:38.913 に答える