我有一个用C ++编写的代码:
#include <iostream>
using namespace std;
class Window;
class Level
{
int level;
int get(Window& w);
public:
Level(void): level(3) {}
void show(Window& w);
};
void Level::show(Window& w)
{
cout << get(w) << endl;
}
class Item
{
static const int item = 8;
};
class Window
{
friend int Level::get(Window& w);
int window;
public:
Window(void): window(2) {}
void show(void);
};
void Window::show(void)
{
cout << "window" << endl;
}
int Level::get(Window& w)
{
return w.window + level;
}
int main()
{
Window wnd;
Level lvl;
wnd.show();
lvl.show(wnd);
cin.get();
return 0;
}
我想要访问类Window
的私有成员,只能由友元函数get
访问,该函数也是类Level
的私有函数。当我正在尝试编译时,我遇到了错误C2248。是否可以将私人功能作为其他班级的朋友?
答案 0 :(得分:4)
如果我正确阅读标准,这看起来像编译器错误(我不知道)。
11.3 / 5:
当朋友声明引用重载的名称或运算符时, 只有参数类型指定的函数才会成为朋友。一个 类X的成员函数可以是类Y的朋友。
请注意,它没有说“ public 成员函数”,只是“成员函数”。对我而言,这意味着接受友谊的功能的隐私不应与给予友谊有关。
答案 1 :(得分:0)
Must friend declaration names be accessible?引用了标准的措辞,即“ [a]由朋友声明指定的名称应在包含该朋友声明的类的范围内可访问”,并给出存在该理由的理由(有些奇怪-)规则。