我正在尝试用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.
}
};
我希望draw()
类的player
方法能够引用deck
类的成员,并能够删除number
个卡片来自cards
的{{1}}。由于deck
是cards
的私有元素,因此我无法在deck
中将其引用为draw()
。我尝试在target_deck.cards
类中添加友元函数:
deck
然而,这并没有解决问题。代码是否有问题,或者是唯一的解决方案(a)在friend void player::draw(deck&target_deck, uint number);
之外定义朋友函数或(b)使整个player
类成为player
的朋友? / p>
提前感谢任何指针!
答案 0 :(得分:4)
我会通过提供一个公共函数deck::draw()
来解决这个问题,该函数从牌组中返回顶牌(并将其从牌组中移除)。然后,您可以根据需要多次调用player::draw()
来实现deck::draw()
。
如果您实施了deck::draw()
,那么您可能需要deck::initialize()
清除套牌,然后再推出52张新卡片。
作为次要样式注释,C ++支持将void
放在不带参数的函数的参数列表中的符号,以便向后兼容C,但在新的C ++代码中并不常用。 C支持它的原因是因为函数声明(原型)foo()
没有说明函数所采用的参数,而foo(void)
表示该函数不带参数。 C ++始终将foo()
视为不带参数。
答案 1 :(得分:0)
你必须在甲板之前加上player
的定义。并且在定义draw
类之后尝试定义deck
函数。
#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.
}