递归朋友课

时间:2011-05-28 00:03:53

标签: c++ friend friend-class

有什么方法可以解决这个问题:

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’

4 个答案:

答案 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();
};