递归朋友类

问题描述

| 有没有办法解决
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();
};