2014-05-15 68 views
2

我試圖用C++編程德州撲克遊戲。我剛開始閱讀關於朋友的功能,並想過如何使用它們讓玩家從卡組中抽出牌。另一類的朋友類函數?

我已經當前定義的兩個類,如下所示:

#include <string> 
#include <vector> 
#include <stdio.h> 
typedef unsigned int uint;  

class deck 

{ 
private: 
    std::vector<card> cards; 
public: 
    void initialize(void) 
    { 
     char suits[] = { 'H', 'C', 'D', 'S' }; 
     uint values[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; 
     for (uint i = 0; i != 4; i++) 
     { 
      for (uint j = 0; j != 13; j++) 
      { 
       cards.push_back(card(suits[i], values[j])); 
      } 
     } 
    } 
    void shuffle(void) 
    { 
     uint i = cards.size(), random_index; 
     card shuffled_card; 
     while (i > 0) 
     { 
      random_index = rand() % (i + 1); 
      shuffled_card = cards[random_index]; 
      cards[random_index] = cards[i]; 
      cards[i] = shuffled_card; 
      i--; 
     } 
    } 
}; 

class player 
{ 
private: 
    std::string name; 
    uint chips; 
    std::vector<card> hand; 
public: 
    player(std::string set_name, uint set_chips) { name = set_name; chips = set_chips; } 
    void draw(deck& target_deck, uint number) 
    { 
     // Draw cards from the top of the 
     // target deck. 
    } 
}; 

我想要player類的draw()方法採取到deck類的成員的引用,以便能夠除去number來自cardsdeck的卡片。由於cardsdeck的私人元素,因此我不能在draw()中將其作爲target_deck.cards來引用。我試着加好友功能爲deck類:

friend void player::draw(deck&target_deck, uint number); 

然而,這並不能解決問題。代碼有問題嗎?或者是唯一的解決方案(a)定義player以外的朋友功能或(b)使整個player類成爲朋友deck

在此先感謝您的指點!

+1

由Greg答案是很好的,我不認爲朋友功能是什麼,你應該使用這裏 –

+1

什麼用'initialize'功能,而不是一個構造函數嗎? –

+0

朋友成員函數應該可以工作:http://msdn.microsoft.com/en-us/library/ahhw8bzz.aspx –

回答

4

我會通過提供一個公共函數deck::draw()來解決這個問題,該函數返回甲板上的最高卡牌(並將其從甲板上移除)。然後,根據需要,根據deck::draw()多次調用player::draw()

如果你實施了deck::draw(),那麼你可能需要deck::initialize()清除卡組,然後再推送52張新卡。

作爲次要的風格筆記,在C++中支持將void放入函數的參數列表中,以便向後兼容C,但在新C++代碼中不常用。 C支持它的原因是因爲函數聲明(原型)foo()沒有提及該函數所採用的參數,而foo(void)說該函數沒有參數。 C++始終將foo()視爲不帶任何參數。

0

你必須在甲板前放置player的定義。也可以在定義deck類後嘗試定義draw函數。

#include <string> 
#include <vector> 
#include <stdio.h> 
typedef unsigned int uint;  

class deck; 

class player 
{ 
private: 
    std::string name; 
    uint chips; 
    std::vector<card> hand; 
public: 
    player(std::string set_name, uint set_chips) { name = set_name; chips = set_chips; } 
    void draw(deck& target_deck, uint number); // define it outside. 

}; 


class deck  
{ 
private: 
    std::vector<card> cards; 
public: 
    friend void draw(deck& target_deck, uint number); 
    void initialize(void) 
    { 
     char suits[] = { 'H', 'C', 'D', 'S' }; 
     uint values[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }; 
     for (uint i = 0; i != 4; i++) 
     { 
      for (uint j = 0; j != 13; j++) 
      { 
       cards.push_back(card(suits[i], values[j])); 
      } 
     } 
    } 
    void shuffle(void) 
    { 
     uint i = cards.size(), random_index; 
     card shuffled_card; 
     while (i > 0) 
     { 
      random_index = rand() % (i + 1); 
      shuffled_card = cards[random_index]; 
      cards[random_index] = cards[i]; 
      cards[i] = shuffled_card; 
      i--; 
     } 
    } 
}; 

void player::draw(deck& target_deck, uint number) 
{ 
     // Draw cards from the top of the 
     // target deck. 
}