有什么方法可以解决这个问题:
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’
答案 0 :(得分:5)
你不能这样做。删除循环依赖项。
答案 1 :(得分:3)
根据IBM's documentation(我意识到这不是规范性的):
必须先定义Y类,然后才能将Y的任何成员声明为另一个类的朋友。
所以我认为答案是“不”。
当然,您可以使用
friend class B;
...而不是friend B::B()
,但这会给B的所有成员带来友谊。你可能已经知道了。
答案 2 :(得分:2)
由于您对友谊(对特定类别的特定成员函数的访问)非常挑剔,Attorney-Client Idiom可能就是您所需要的。不过,我不确定这对构造函数有多好。
答案 3 :(得分:1)
我意识到这是一个非常愚蠢的想法,但是理论上你不能通过继承来实现这一点,通过使父类的构造者成为朋友吗?尽管可能,但代码编译至少是有问题的。
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();
};