另一个类的友元类函数

Friend Class Function For Another Class?

本文关键字:类函数 友元 另一个      更新时间:2023-10-16

我正在尝试在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卡。由于cardsdeck的私有元素,我不能在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.
 }