另一个类的友元类函数
Friend Class Function For Another Class?
我正在尝试在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
类的成员,并能够从deck
cards
中删除number
卡。由于cards
是deck
的私有元素,我不能在draw()
中将其引用为target_deck.cards
。我尝试在deck
类中添加一个朋友函数:
friend void player::draw(deck&target_deck, uint number);
然而,这并不能解决问题。代码是否有问题,或者唯一的解决方案(a(在player
之外定义一个友元函数或(b(使整个player
类成为deck
的友元?
提前感谢您的任何指示!
我会通过提供一个公共函数deck::draw()
来解决这个问题,它从牌组中返回顶牌(并将其从牌组中移除(。然后,您可以根据需要多次调用player::draw()
,从而在deck::draw()
方面实现它。
如果你实现了deck::draw()
,那么你可能希望deck::initialize()
在将 52 张新牌推到上面之前清除一副牌。
作为次要样式说明,为了向后兼容 C,C++ 支持将 void
放入不带参数的函数的参数列表中的表示法,但在新的C++代码中不常用。C 支持它的原因是,函数声明(原型(foo()
没有说明函数采用的参数,而foo(void)
说函数不接受参数。C++总是把foo()
当作不争论。
你必须
把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.
}
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 将派生类的构造函数声明为父类的友元
- 基类中受保护的纯虚函数如何被基类的友元类使用?
- 类C++友元函数无法访问封装的类
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 为什么模板函数不能是模板类的友元模板函数
- 类具有友元函数.该函数在不同的头文件中的同名 apce 中定义.它无法访问私有成员
- 虚函数可以访问基类的友元吗?
- 在派生类中重新定义基类的友元函数
- 将静态类与友元函数链接时出现奇怪错误
- 尝试调用模板类的友元函数
- 在基/派生类的成员函数/友元函数中派生* 到 Base* 的转换
- 来自多个类的友元模板函数
- 命名空间内类的友元函数
- 类内友元函数的返回类型推导
- 基类和派生类的友元函数
- 为什么 PRIVATE 成员函数不能是另一个类的友元函数?
- 类的友元函数产生错误:"未声明'___'成员函数"
- 在参数中接受 2 个类的友元函数 - 未定义'Class'