gpt4 book ai didi

c++ - 如何在多个类中使用友元函数

转载 作者:行者123 更新时间:2023-11-30 04:20:32 25 4
gpt4 key购买 nike

我正在尝试创建一个非成员(member) operator<< .但是,我希望我的两个类(class)可以访问运算符(operator)。运营商是

void operator<< (ClassA & a, ClassB & b)

在两个类的公共(public)部分,我说:

friend void operator<< (ClassA & a, ClassB & b);

但是,结果发现operator可以访问CLass B中的private成员变量但无法访问 Class A 中的私有(private)成员变量.

为什么?

真正的代码:在 cpp 文件中:

void operator<< (Hand& h, Deck& d){

h.hand.push_back(d.card[0]);
sort(h.hand.begin(),h.hand.end());
d.card.erase(d.card.begin());
}

在头文件中:

class Deck {

private:
vector<Card> card;

public:
friend void operator<< (Hand& , Deck& );
};

class Hand {

private:
vector<Card> hand;

public:
friend void operator<< (Hand& , Deck& );
};

而且卡片文件没有用。

最佳答案

更新 已编辑的问题:以下代码编译对我来说没问题:

#include <vector>
#include <algorithm>
typedef int Card;

class Hand; // NOTE forward declaration

class Deck {
private:
std::vector<Card> card;

public:
friend void operator<< (Hand& , Deck&);
};

class Hand {
private:
std::vector<Card> hand;

public:
friend void operator<< (Hand& , Deck&);
};

void operator<< (Hand& h, Deck& d) {
h.hand.push_back(d.card[0]);
std::sort(h.hand.begin(),h.hand.end());
d.card.erase(d.card.begin());
}

int main()
{
}

是不是忘记在头文件中转发 declare Hand


您可能会感到困惑,因为您可以在类的声明之一中定义静态友元函数的主体。

不过, friend 声明始终只是一个声明。所以,其实

struct A;
struct B;

struct A
{
friend bool operator<<(A const&, B const&);
};

struct B
{
friend bool operator<<(A const&, B const&);
};

bool operator<<(A const&, B const&)
{
// access to both A and B
return false;
}

等同于

struct A;
struct B;

struct A
{
friend bool operator<<(A const&, B const&)
{
// access to both A and B
return false;
}
};

struct B
{
friend bool operator<<(A const&, B const&);
};

关于c++ - 如何在多个类中使用友元函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15232809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com