2011-01-06 3 views
1

私は現在、Yahtzeeのゲームをプログラミングしていますが、私のクラスのいくつかに問題がありますC++で別のクラスメンバー変数を使用する方法は?

私はPlayerとScorecardという2つのクラスを持っています。

class Player { 
    private: 
    string name; 
    Scorecard scorecard; 
}; 


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

(すべてのクラスは、適切なゲッターとセッターを持っている)

私はスコアカードのクラスは、ユーザーにプレーヤーの名前を表示できるようにしたいと思います。何かできることはありますか?

+4

これは私の言いたいことを 'すべてのクラスに適切なゲッターとセッターがあります。適切に設計されたクラスはゲッター/セッターを必要としません –

答えて

5

私はスコアカードはプレイヤーの名前を印刷していません。プレーヤーのスコアはです。スコアカードにはプレーヤーがありません。プレイヤーはスコアカードが含まれているので、あなたがクラスプレーヤーの前にスコアカードのクラスを宣言する必要があり、また

class Player 
{ 
    private: 
    string name; 
    Scorecard scorecard; 

    public: 
    void display(void) 
    { 
     cout << "Player name: " << name << endl; 
     scorecard.display(); 
    } 
}; 

プレイヤークラスは、スコアカードに続いてプレイヤーの名前を表示するdisplay方法を持っている必要があります

class Scorecard 
{ 
/*... */ 
}; 

class Player 
{ 
/* ... */ 
}; 
+0

これは最高の解決策のようです。ありがとうございます。 – Stephen

1

スコアカードにプレーヤーのインスタンスを何らかの形で与える必要があります。また、プレイヤーはパブリックゲッターが必要ですか、nameを公開する必要があります。

+0

申し訳ありませんが、プレイヤーにはすべての変数のゲッターとセッターがあります。私はそれを追加しました – Stephen

+0

あなたはゲッターとセッターに与えた名前を本当に綴るべきです。彼らはObjective-CのようにC++で標準化されていません。 –

0

これを行う最善の方法は、Player :: nameへのコピーまたは定数参照を返すパブリックアクセサメソッドをPlayerに追加することです。

+1

これは、スコアカードにPlayerの参照がないという問題を解決しません。 – Falmarri

0

いくつかのオプションがあります。

  1. display()のパラメータとして渡す名前。へowining Playerへの参照を渡す

  2. (あなたは右?ない場合は、あなたもその名を取得するためPlayerにパブリックアクセサメソッドを追加する必要があります。、Playerのメンバ関数内からdisplay()を呼び出しています) Scorecardオブジェクト(コンストラクタなど)を使用し、Scorecardに格納します。その名前を取得するために公共のアクセサーmenthodをPlayerに追加します。個人的に

それはPlayerScorecardクラス間の依存関係を最小限に抑えることができますので、私は、(1)の方が好き。

0

スコアカードにPlayerNameプロパティを追加すると、名前を保存できます。 は、ディスプレイ()関数は、私はそれを所有しているPlayerについてScorecardを伝えたい、

0

一般的にパラメータとして名前を取得します:

class Scorecard; 

class Player { 
    public: 
    explicit Player(const string& name_): name(name_), scorecard(*this) {} 
    const string& Name(oid) const { return name; } 
    private: 
    string name; 
    Scorecard scorecard; 
}; 

class Scorecard { 
    public: 
    Scorecard(Player& player_): player(player_) {} 
    void display() { 
     cout << player.Name() << endl; 
     //... 
    } 
    private: 
    Player& player; 
}; 
関連する問題