问题描述
|
有没有办法解决:
class B;
class C {
public:
C() { }
private:
int i;
friend B::B();
};
class B {
public:
B() { }
private:
int i;
friend C::C();
};
给出错误:
prog.cpp:8: error: invalid use of incomplete type ‘struct B’
prog.cpp:1: error: forward declaration of ‘struct B’
解决方法
你就是做不到。删除循环依赖项。
, 根据IBM的文档(我意识到这不是规范性的):
必须先定义类Y,然后才能将Y的任何成员声明为另一个类的朋友。
因此,我认为答案是“否”。
当然可以
friend class B;
...而不是friend B::B()
,但可以使B \的所有成员之间保持友谊。您可能已经知道了。
, 由于您对友谊非常有选择性(可以访问特定类的特定成员功能),因此可能需要律师-客户惯用语。不过,我不确定这对构造函数的效果如何。
, 我意识到这确实是一个愚蠢的想法,但是,从理论上讲,您不能通过使父类的构造函数成为朋友来通过继承来实现这一点吗?该代码至少可以编译,但可能会产生问题。
class A {
public:
A() { }
private:
int i;
};
class D {
public:
D() { }
private:
int i;
};
class B : public A {
public:
B() { }
private:
friend D::D();
};
class C : public D {
public:
C() { }
private:
friend A::A();
};