わかりました、これは非常に奇妙です...私は思います。タイトルの意味は次のとおりです。
私が持っている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..これがより明確になることを願っています。