多层次的友谊
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 已经可以访问它自己的私有成员。所以称它为自己的朋友是多余的。
在下面的代码中:
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 已经可以访问它自己的私有成员。所以称它为自己的朋友是多余的。