2011-09-17 5 views
2

私は2つの異なるクラスが別のクラスオブジェクトを共有して変更できるようにするために少し問題があります。C++オブジェクト間で変数を共有しています。

私はHumanPlayerクラス、ComputerPlayerクラス、Boardクラスを持っています。 2つのプレーヤークラスは、1つのボードクラスと対話できる必要があります。私は、同じBoardオブジェクトへの参照を各クラスに渡すことができると思っていましたが、私が望むように動作しているようには見えません。ここでは、メインに何の一部だと私は私ができるように最善を何が起こっているのかを説明します:

Board *board2 = new Board(); 
    board2->setBoardSize(5); 
    board2->initPits(); 

    HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true); 

    firstPlayer.removeFromPit(3); 

    board2->showBoard(); 

firstPlayer.removeFromPit(3);

//main.cppはちょうどにボードクラスの配列に値を設定することになっていますゼロ。それはそうする。 FirstPlayerクラスのコード内からボードを表示すると、変更が反映されます。しかし、board2->showBoard()と呼ぶと、何も変わっていないかのようです。それはまだ元の変更されていないボードです。私が実際にやりたいことは、firstPlayerクラスとsecondPlayerクラスを1つの共有ボードオブジェクトで動作させることです。私は今これを正しく実装する方法がわかりません。

ありがとうございました。より多くの情報が必要な場合はお知らせください。

+0

'HumanPlayer firstPlayer(* board2、* menu、menu-> askForFirstTurn()、true);'は未定義の動作です。 – Marlon

+0

@マールロン:どうですか?それは私にはうまく見えます。 –

+0

あなたが投稿したコードはわかりましたか?あなたが説明したことを正確に行うべきです。ですから、問題はおそらくremoveFromPit()がどのように実装されているかです。あるいは、HumanPlayerクラスの内部にボードリファレンスをどのように保存するのでしょうか。 – tp1

答えて

3

参照することなくボードオブジェクトをコピーしているようです。プレーヤークラスのコンストラクタは次のようになります。あなたはどこにでも(コンストラクタシグネチャまたはクラスのメンバ変数のいずれか)&オペレータ含まれていない場合

class Player 
{ 
public: 
    Player(Board& board) // REFERENCE TO Board 
     : the_board_(board) // initialize the reference 
    { 
    } 

protected: 
    Board& the_board_; // REFERENCE to Board 
}; 

あなたがその意志ボードのコピーを作成しますあなたのクラス内で使用される。

1

HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true);

あなたは値によって第一パラメータを渡します。 *を削除して、firstPlayerの機能に追加してください。

+0

これは、参照ではなくポインタによってボードを渡します。これを受け入れるクラスのコンストラクタが適切に記述されていれば、これを参照して渡すことができます。 – Chad

+0

ポインタでパラメータを渡すことについて何が問題になっていますか?クラスコンストラクタに関係なく正常に動作します。 –

1

おそらく参照をすべて使用しているとは限りません。

  1. HumanPlayerのコンストラクタを基準としてボードを取らなければならない(会&):チェックするには、2つのものがあります。ボード&がパラメータのタイプであることを確認してください。それ以外の場合は、コンストラクターを呼び出すときに、暗黙のうちにボードのコピーを作成して、コンストラクターが理事会を価値あるものにすることができます。

  2. ボードのHumanPlayerのメンバー変数のタイプは、ボード&である必要があります。それ以外の場合は、メンバ変数を設定するときに、元のBoardオブジェクトからデータを暗黙的にコピーします。メンバー変数として参照を使用する場合、代入ではなくconstructor initializer listを使用する必要があることに注意してください。使用して初期化するので、あなたは

    HumanPlayer firstPlayer(*board2, *menu, menu->askForFirstTurn(), true); 
    

    とそれを呼び出すときに、実際にfirstPlayerを持って

    HumanPlayer(Board board, Menu menu, int askForTurn, int otherBoolean); 
    

1

私の最高の推測では、HumanPlayerのコンストラクタのあなたの宣言のようなものに見えるということでしょうboard2である。

これはあなたのコードは、あなたがHumanPlayerのコンストラクタが搭乗する参照を受け取るために宣言されていることを確認する必要があり、どのように見えるか確かであれば(そしておそらくメニューを?)。それは次のようになります:

HumanPlayer(Board& board, Menu& menu, int askForTurn, int otherBoolean); 
関連する問題