多层次的友谊

Multiple level friendship

在下面的代码中:

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; 

为什么当 class 成员向其他 class 成员推荐时,友谊不起作用?

试试这个:

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

虽然这是对 friend 的奇怪用法,但我认为它是出于学习目的。也就是说,您应该像这样修改 friends 定义:

class B{
    friend class Other; // Because you access private member x from Other::foo()
    int x;
    int y;
};

class A{
    friend class Other; // Because you access private member b from Other::foo()
    int a;
    B* b;
public:
    A(){ b = new B();}
};

struct Other{
    A a;
    void foo(){
      // Access A's private member b
      // Access B's private member x
      std::cout << a.b->x; 
    }
};

这一行:

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

涉及访问A的私有成员(b)和B的私有成员(x) class Other.虽然 A 授予 Other 访问权限,但 B 没有,因此出现错误。如果你想让它工作,你需要添加:

class B {
    friend class Other;
};

旁注,此声明无意义:

class A {
    friend class A;
};

A class 已经可以访问它自己的私有成员。所以称它为自己的朋友是多余的。