问题描述
|
我想让一个内部类成为一个无关类的朋友,但这似乎不起作用(至少在gcc 4.1.2中):
class A {
int i;
friend class B; // fine
friend class B::C; // not allowed?
};
class B {
int geti(A* ap) { return ap->i; }
class C {
int geti(A* ap) { return ap->i; }
};
};
解决方法
使用前必须先声明“ 1”。以下可能有效。
更新:根据要求忽略可用的演示,这是一种构造可行的方法(减去成员函数的定义),该方法可以起作用,但请记住,一切都是私有的。
class A;
class B
{
int geti(A * ap);
public:
class C
{
int geti(A * ap);
};
};
class A
{
friend class B; // fine
friend class B::C; // fine too
int i;
};
然后在其他地方定义getter函数:
int B::geti(A * ap) { ... }
int B::C::geti(A * ap) { ... }
备选:向前声明嵌套类B::C
并保存一个外部定义:
class A;
class B
{
int geti(const A * ap) const; // we cannot use A yet!
public:
class C;
};
class A
{
friend class B; // fine
friend class B::C; // fine too
int i;
};
int B::geti(const A * ap) const { return ap->i; }
class B::C
{
inline int geti(const A * ap) const { return ap->i; }
};