2016-07-29 4 views
3

ここにはありません。私はPlayerオブジェクトmainCharacterを複数のクラスにわたって変更しようとしています。私は現在、下記のように宣言されたPlayerオブジェクトを持っています。 Playerは様々な世界にテレポートしてモンスターと戦うことができます。C++複数のクラス間で同じオブジェクトに変更を加える方法は?

すべてのコードが動作します。 1つの世界の敵が敗北すると、彼らは敗北し続ける。私の問題は、彼が別の世界にテレポートするとき、Playerの統計はすべてデフォルト値にリセットされていることです。彼は前の世界の敵からのダメージを受けた後でさえ、完全なライフポイントを再び持つ。

複数のクラスまたはワールドにわたって同じPlayerオブジェクトを変更するにはどうすればよいですか?私は宣言に問題があると思っていますが、わかりません。私は入力を感謝します。ありがとう!

mainCharacterオブジェクトが宣言されている

Player.hpp

class SpaceList 
{ 
    protected: 
     class SpaceNode 
     { 
      friend class SpaceList; 
      Player mainCharacter; 
      Space* thisSpace; 
      SpaceNode* next; 
      SpaceNode(int m, SpaceNode* next1 = NULL) 
      { 
       if(m == 0) 
       { 
        thisSpace = new EntranceHall(&mainCharacter); 
       } 
       else if(m == 1) 
       { 
        thisSpace = new WaterSpace(&mainCharacter); 
       } 

パート:Player.cpp

class Player: public Interactable 
{ 
    protected: 
     Backpack myBackpack; 
    public: 
     Player(); 
     virtual interactableType getInteractableType(); 
     virtual int interact(); 
     virtual int attack(); 
     virtual void defend(int); 

をパート:

mainCharacterEntranceでオフを開始する(Entrance.cpp):

EntranceHall::EntranceHall(Interactable* mainCharacter) 
{ 
    interactableGrid[6][3] = mainCharacter; 
    interactableGrid[0][3] = new Portal(0);//entrance portal 
    interactableGrid[3][3] = new InterestPoint(0);//stone mural 
} 
mainCharacterは後でウォーターワールドへテレポートする

は、デフォルト値がリセットさ (Waterspace.cpp):

WaterSpace::WaterSpace(Interactable* mainCharacter) 
{ 
    interactableGrid[3][0] = mainCharacter; 
    interactableGrid[3][3] = new Boss(this->getSpaceType()); 
+0

「mainCharacter」はどこに作成されていますか?それは、あなたが新鮮な 'Player 'インスタンスを与えるたびに新たに作成されたように聞こえます。代わりに、1人のプレイヤーを作成してそのインスタンスを使いたいと思うようです。 –

+0

@SteveFranciscoそれはまさに私がやりたいことです。私はspacelist.hppで作成しました。EntranceHallとWaterSpaceなどに同じPlayerを送信していたと思います。EntranceHallのPlayerに変更が加えられた場合、WaterSpaceに反映されますが、そうではありません。 – anna

+1

以下の答えは正しいアイデアを持っています。スペースノードのmainCharacterは、スペースノードが作成されるたびにデフォルトでインスタンス化されます。 Playerオブジェクトを一度作成し、SpaceNodeメソッドまたはコンストラクターの引数として個々のスペースに渡したいと思うかもしれません。 – DaveyLaser

答えて

6

は削除してい-SpaceNodePlayerとの関係 - どこか外Playerのインスタンスを作成しますあなたが慣れていたように、それを参照するポインタを使用します。または、それをstaticにして、再構築されない(またはむしろ各SpaceNodeのために別々に構築される)インスタンスが1つしかないようにします。


注:

  • リンクリストを自分で実装しないでください、このデータ構造は、ここでも合いません。試してくださいstd::vector

  • スマートポインタへの切り替えが改善されました。あなたはそれを知らずに記憶を漏らしているかもしれません。

+0

@LogicStuffの提案に感謝します!ありがとう! – anna

+0

@annaよろしくお願いいたします。質問が解決されたことを示すことは、タイトルを編集するのではなく、回答を受け入れることによって行われます。 – LogicStuff

関連する問題