多层次的友谊

时间:2016-03-23 19:25:54

标签: c++ friend

在下面的代码中:

class B {
    int x;
    int y;
};

class A {
    friend class Other;
    friend class A;
    int a;
     B* b;
public:
    A(){ b = new B();}
};

struct Other {
    A a;
    void foo() {
        std::cout << a.b->x;  // error
    }
};

int main() {
    Other oth;
    oth.foo();
}

指示的行失败了:

t.cpp:22:19: error: 'x' is a private member of 'B'
std::cout << a.b->x;
                  ^
t.cpp:7:5: note: implicitly declared private here
int x; 

为什么在从班级成员转介到其他班级成员时,友谊不起作用?

3 个答案:

答案 0 :(得分:2)

虽然这是WebClient的奇怪用法,但我认为这是出于学习目的。也就是说,您应该按照以下方式修改friend定义:

friends

答案 1 :(得分:2)

这一行:

std::cout << a.b->x;

涉及在A课程中访问bB)的私人成员和xOther)的私人成员。虽然A授予Other访问权限,但B没有,因此错误。如果您希望这样做,您需要添加:

class B {
    friend class Other;
};

旁注,这个宣言毫无意义:

class A {
    friend class A;
};

一个类已经可以访问自己的私有成员。称之为自己的朋友是多余的。

答案 2 :(得分:0)

试试这个:

class B{
friend class Other;
int x;
int y;
};