2011-01-06 210 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; 
}; 
相關問題