c ++:オブジェクトの変数は評価できませんが、同じオブジェクトへの参照からの変数は評価できますか?

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

  •  10-07-2019
  •  | 
  •  

質問

わかりました、これは奇妙です...私は思う。タイトルの意味:

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

state->getHumanPieces();

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

handler->state->getHumanPieces();

完全に機能します。 これをさらに明確にするために:

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

ところで、VS08デバッガーは私が言っていることを示しています:

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

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

編集: thisポインターが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.hには、同様の構造(シングルトン)とactionHandler *プライベート変数があり、以下で初期化されます:

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

およびハンドラーを返すgetHandler()funcも。 これはすべてmain.cppで初期化されます:

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

そして次に使用されます:

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

main.cppは、ヘッダーなしのシンプルな.cスタイルで記述されているため、はい、ハンドラーを呼び出す関数は静的であると考えられます...しかし、gameState *ポインターも呼び出します。 actionHandler *の1つと同じように。

役に立ちましたか?

解決

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

他のヒント

this ポインターがnullです。

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

actionHandler* actObj = 0;
actObj->act(); // ERROR access violation

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

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

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

たとえば、次のようなオブジェクトを取得します。

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

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

そのため、 handler-> state-> getHumanPieces()を使用すると動作します。これは、実際にはCThingクラス(ハンドラ)のインスタンスではなく、クラス定義自体。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top