2

これを C++ で動作させるのに苦労しています。C# で管理しましたが、C++ をあまり使用していないため、構文がわかりません。

これの目的は単純な状態マネージャーのためであり、各状態は「状態」と呼ばれる基本クラスから継承されます。

オーバーライドして機能するようになりましたが、ポリモーフィズムの側面を管理できないようです。つまり、オブジェクト「State currentState」を持ち、そのオブジェクトを「menuState」に等しく設定して、目的の機能を実行させることはできません。これは、State クラスのシグネチャを見つけるだけであるためであることはわかっていますが、方法がわかりませんそれを避けてください。誰かが私を理解するのを助けることができるように、ここにいくつかの単純化されたコードがあります。

// stringstreams
#include <iostream>
#include <string>
#include <sstream>
using namespace std;

// State.h
class State{
public:
  virtual void drawState();
};

// State.cpp
void State::drawState() {
    cout << "Base state.\n";
}

// MenuState.h
class MenuState: public State {
public:
  virtual void drawState();
};


// MenuState.cpp
void MenuState::drawState() {
    cout << "Menu state.\n";
    State::drawState();
}

int main ()
{
    State currentState;
    MenuState menuState;

    currentState = menuState;
    currentState.drawState();

    system("pause");
    return 0;
}

「State currentState」を変更してMenuStateのオブジェクトを作成すると、コードは必要に応じて機能しますが、現在の状態を将来作成する他の状態に設定できるように、親クラスにする必要があります。 GameState として。

ありがとうございました。

4

2 に答える 2

5

スライスのため、ポリモーフィズムは単純なオブジェクトでは機能しません。参照または (スマート) ポインターを使用する必要があります。あなたの場合、参照を再割り当てできないため、ポインターは次のようになります。

int main ()
{
    State* currentState = NULL;
    MenuState menuState;

    currentState = &menuState;
    currentState->drawState(); //calls MenuState::drawState()

    NextState nextState; //fictional class
    currentState = &nextState;
    currentState->drawState(); //calls NextState::drawState()

    system("pause");
    return 0;
}

あなたのコードで:

State currentState;
MenuState menuState;

currentState = menuState;

割り当てスライス- 基本的にその一部を にmenuStateコピーするだけで、他のすべての型情報が失われます。StatecurrentState

于 2012-10-20T23:19:57.437 に答える
2

コードを次のように変更します。

int main ()
{
    State *currentState;

    currentState = new MenuState();
    currentState->drawState();

    system("pause");
    delete(currentState)
    return 0;
}
于 2012-10-20T23:23:11.320 に答える