递归友元类

recursive friend classes

本文关键字:友元 递归      更新时间:2023-10-16

有什么办法解决这个问题吗:

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