2011-01-06 211 views
1

我目前正在编程一个Yahtzee游戏,并且遇到了一些类问题如何在C++中使用其他类成员变量?

我有两个类:玩家和记分卡。

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


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

(所有类都有相应的getter和setter)

我想记分卡类能够显示玩家的用户名。有什么办法可以做到吗?

+4

这让我感到害怕'所有的课都有相应的getter和setters'。正确设计的课堂不需要获得者/设置者 – 2011-01-06 01:41:56

回答

5

我不会有记分卡打印玩家的姓名。一名球员has-a记分卡。记分卡没有玩家。

Player类应该有一个显示该玩家的名字后面的记分卡一display方法:

class Player 
{ 
    private: 
    string name; 
    Scorecard scorecard; 

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

此外,由于播放器包含一个记分卡,你应该级球员之前声明的记分卡类:

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

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

这似乎是最好的解决方案,谢谢。 – Stephen 2011-01-06 01:04:05

1

你必须以某种方式给记分卡作为玩家的实例。此外,玩家需要公开的获得者或公开制作name

+0

对不起,玩家对所有变量都有getter和setter。我已经在 – Stephen 2011-01-06 00:41:42

+0

中加入了,你真的应该拼出你给予getter和setter的名字。它们在Objective-C中不像C++那样标准化。 – 2011-01-06 00:43:49

0

要做到这一点,最好的方法是向Player添加一个公共访问器方法,该方法返回Player :: name的副本或常量引用。

+1

这并不能解决记分卡没有提及玩家的问题。 – Falmarri 2011-01-06 00:33:04

0

有几种选择。

  1. 传递名称作为display()函数的参数。 (您从Player成员函数中调用display(),对吗?如果没有,你还需要一个公共的访问方法添加到Player用于获取它的名字。)

  2. 传向owining Player参考Scorecard对象(例如通过构造函数)并将其存储在Scorecard中。为了得到它的名字,添加一个公共访问器到Player

个人而言,我喜欢(1)比较好,因为它允许PlayerScorecard类之间最小化的依赖关系。

0

您可以将一个PlayerName属性添加到记分卡,然后它将能够存储一个名称。 则显示()函数将得到名作为参数

0

通常情况下,我会告诉Scorecard大约拥有它的Player

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; 
}; 
相关问题