2016-08-29 20 views
1

以下は、3つのクラスを詳述した簡略化されたヘッダーファイルです。私は私の "Game"クラスのポインタをプライベートにして、Introductionにそれを変更させたいと思っています。しかし、そのままでは動作しません。 IntroductionはGameStateの派生物なので、私はこのポインタを変更できると思ったのですか?例はこれが可能であることを示していた。私はこれをゲーム内のパブリックスペースに移動したくはありません。私は、次のされた例がここにいたC++ネストされたクラスへのアクセス

class Introduction; 
class Game; 
class GameState; 

class GameState 
{ 
    public: 

    static Introduction intro; 

    virtual ~GameState(); 
    virtual void handleinput(Game& game, int arbitary); 
    virtual void update(Game& game); 

}; 


class Introduction : public GameState 
{ 
public: 

    Introduction(); 

    virtual void handleinput(Game& game, int arbitary); 

    virtual void update(Game& game); 

}; 


class Game 
{ 
public: 

    Game(); 

    ~Game(); 

    virtual void handleinput(int arbitary); 

    virtual void update(); 

private: 

    GameState* state_; 

}; 

... http://gameprogrammingpatterns.com/state.html

編集:私はこのような何かをやりたいと思っています...

void Introduction::handleinput(Game& game, int arbitary) 
     { 
      if (arbitary == 1) 
      std::cout << "switching to playing state" << std::endl; 
      game.state_ = &GameState::play; 
     } 

編集:回答いただきありがとうございます、私はゲッターとセッターが行く方法だと思う。そして、問題は明らかではないことを謝ります。 問題は、私が実行しようとしていた実装を理解していないということでした。私はまだそれを理解していないが、明らかに同じことを達成する方法がある。

+2

はただ非常に悪い問題の説明で、「これが動作していない」と述べました。 ***どのように動作していないのですか?また、[良い質問をする方法について読む](http://stackoverflow.com/help/how-to-ask)をご覧ください。 –

+0

あなたはこれらのクラスの使い方を示していません。 –

+0

私はこの使い方の簡単な例を追加しました。これはリンクで可能であると示されました。 –

答えて

1

2つの解決策があります。あなたのGameクラスでfriendクラスを宣言することができフレンドクラス

を使用して

ような何か:このように

class Game { 
public: 
    // ... 
private: 
    // ... 
    friend class Introduction; 
}; 

、クラスIntroductionGameクラスのプライベートメンバにアクセスして、それを修正することができるようになります。


getterとsetter

あなたは原則を隠しデータを保存したい場合、あなたは自分のゲームの状態を変更するために公共の部材を提供することができます。ここで

、例:

class Game { 
public: 
    void setNewState(GameState* setter) noexcept; 
    const GameState* getCurrentState() const noexcept; 
    // ... 
}; 
+0

**ゲッターとセッター**を使うことは、**フレンドファンクション**を使用しているため、カプセル化の原則に反するため、最優先の解決策でなければなりません。 –

+0

デザインの選択によって異なります。時には* OOP *は単なる高価な過負荷です。それらの2つのクラスが厳密に近い場合、* friend *は良い選択になる可能性があります。一般的に、あなたのデザインはOOPです。それであなたは絶対に正しいです!カプセル化の原則を守り、ゲッターとセッターを使用する。 –

0

GameStateの保護されたメンバーにGameがアクセスできるように、ポインタをProtectedにしてGameStateとゲームを友人にすることができます。 しかし、上記のコメントが示すように、実際にあなたが実際に何を求めているのかは明らかではありません。

1

ゲッターとセッターはどうですか?

class Game 
{ 
public: 

    .... 
    GameState * getGameState() const { return state_; } 

    void setGameState(GameState * newState) { state_ = newState; } 

    .... 

private: 

    GameState* state_; 
} 
関連する問題