2016-06-16 14 views
0

私は、プレイヤーオブジェクトとゲームオブジェクトの2つがあるプロジェクトに取り組んでいます。別のクラスの別のクラスの関数を呼び出す

2人のプレイヤーオブジェクトは、ゲームオブジェクトの機能display()にアクセスする必要がありますが、これはどのように実行できるのかわかりません。以下は

は、コアの問題を強調抜粋です:

class Game 
{ 
public: 
    Game() {} 
    display() {...} 
    ... 
}; 

class Player 
{ 
public: 
    Player() {} 
    void input() 
    { 
     ... 
     // display(); 
     ... 
    } 
}; 

この問題を解決する方法を提案してください。このデザインパターンに根本的な問題がある場合は、修正してください!

+0

私はあなたのデザインに疑問があります。特にオブジェクトインスタンスがグローバル変数である場合はどうでしょうか?私は 'Game'オブジェクトや' Player'オブジェクトをグローバル変数にするのではなく、 'Game'オブジェクト(参照またはポインタとして)を' Player'コンストラクタに渡し、それぞれの 'Player'オブジェクトストアこの参照またはポインタを使用してその参照またはポインタを使用します。それで 'Game :: display'関数を何度も呼び出しても' Player'オブジェクトは簡単です。 –

+0

@JoachimPileborgゲームとプレーヤーのオブジェクトは元のコードではグローバル化されていませんでしたが、私がこの例を作ったとき、私はそれらをグローバルにしました。しかし私はあなたの考えが好きです。病気はそれを実装しようとする。 –

答えて

1

なぜですか?

void input() 
{ 
    game.Display(); 
} 

おそらく、あなたはそれにPlayerオブジェクトを渡す必要があります。したがって、これを次のように変更してください。

class Player; // FORWARD declaration 
class Game 
{ 
public: 
    Game() {} 
    void display(Player& player); // Implement elsewhere not here. 

    // Another way 
    void display(Player* player = NULL); // Implement elsewhere not here. 
    ... 
}; 
... 
void input() 
    { 
     game.Display(*this); 
      game.Display(this); // another way 
    } 
+0

それは本当ですが、問題の解決策を手にしました。このコメントは私のためではなく、OPのためのものですか? – Ajay

+0

ありがとう!しかし、表示機能もゲームオブジェクトで使用する必要があります。つまり、まったく同じ機能をオーバーロードする必要がありますか? –

+1

これは 'display'関数で何をしたいのか、' Player'オブジェクトで何をするかによって異なります。 'display'を' Player * 'に変更し、' NULL'をデフォルトに保つことができます。 – Ajay

関連する問題