2014-05-15 3 views
2

연습으로 C++에서 Texas Hold'em 게임을 프로그래밍하려고합니다. 방금 친구 기능에 대해 읽었으며, 플레이어가 갑판에서 카드를 가져올 수 있도록하기 위해이 기능을 사용하는 것에 대해 생각했습니다.다른 클래스의 친구 클래스 기능?

다음과 같이 저는 현재 두 개의 클래스를 정의

: 나는 deck 클래스의 멤버에 대한 참조를 취하도록 player 클래스의 draw() 방법을 싶습니다 및 number을 제거 할 수

#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. 
    } 
}; 

카드는 cards에서 deck입니다. cardsdeck의 개인 요소이므로 draw()target_deck.cards으로 참조 할 수 없습니다. 나는 deck 클래스로 친구 기능을 추가하는 시도했습니다

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

이, 그러나, 문제가 해결되지 않습니다. 코드에 문제가 있습니까? 아니면 player 외부의 친구 함수를 정의하는 유일한 해결책입니까? (b) player 클래스 전체를 deck의 친구로 만드시겠습니까?

미리 알려 주셔서 감사합니다!

+1

그렉에 의해 대답은 좋다, 난 당신이 여기 –

+1

뭐죠'initialize' 기능을 대신 생성자 최대를 사용해야 어떤 친구 기능이 생각 해달라고? –

+0

친구 멤버 함수가 작동해야합니다 : http://msdn.microsoft.com/en-us/library/ahhw8bzz.aspx –

답변

4

공용 기능 deck::draw()을 제공함으로써이 문제를 해결할 수 있습니다.이 기능은 덱에서 맨 위의 카드를 반환하고 덱에서 카드를 제거합니다. 그런 다음 player::draw()deck::draw() 번으로 구현하여 필요에 따라 여러 번 호출 할 수 있습니다.

deck::draw()을 구현하면 5233 개의 새 카드를 넣기 전에 deck::initialize()에서 덱을 초기화해야합니다.

작은 스타일 메모로 인수가없는 함수의 매개 변수 목록에 void을 넣는 표기법은 C++과의 하위 호환성을 위해 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. 
}