我正在尝试创建非成员operator<<
。但是,我希望我的两个类可以访问该运算符。运营商是
void operator<< (ClassA & a, ClassB & b)
在两个公共部分,我说:
friend void operator<< (ClassA & a, ClassB & b);
但事实证明,运营商可以访问CLass B
中的私有成员变量,但无法访问Class A
中的私有成员变量。
为什么?
真实代码: 在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& );
};
卡片文件不起作用。
答案 0 :(得分:2)
更新编辑问题:以下代码对我来说没有问题:
#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()
{
}
您是否忘记在头文件中转发声明Hand ?
您可能会感到困惑,因为您可以定义其中一个类声明中的静态友元函数的主体。
仍然,朋友声明始终只是声明。所以,实际上
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&);
};