私人功能作为其他班级的朋友

时间:2014-02-27 17:48:38

标签: c++ class encapsulation friend

我有一个用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。是否可以将私人功能作为其他班级的朋友?

2 个答案:

答案 0 :(得分:4)

如果我正确阅读标准,这看起来像编译器错误(我不知道)。

11.3 / 5:

  

当朋友声明引用重载的名称或运算符时,   只有参数类型指定的函数才会成为朋友。一个   类X的成员函数可以是类Y的朋友。

请注意,它没有说“ public 成员函数”,只是“成员函数”。对我而言,这意味着接受友谊的功能的隐私不应与给予友谊有关。

答案 1 :(得分:0)

Must friend declaration names be accessible?引用了标准的措辞,即“ [a]由朋友声明指定的名称应在包含该朋友声明的类的范围内可访问”,并给出存在该理由的理由(有些奇怪-)规则。