8

有没有办法解决:

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

4 回答 4

5

你不能这样做。移除循环依赖。

于 2011-05-28T00:16:05.090 回答
3

根据IBM 的文档(我意识到这不是规范的):

必须先定义类 Y,然后才能将 Y 的任何成员声明为另一个类的朋友。

所以我认为答案是“不”。

当然,你可以使用

friend class B;

...而不是friend B::B(), 但这会给 B 的所有成员带来友谊。你可能已经知道了。

于 2011-05-28T00:21:13.623 回答
2

由于您对友谊非常挑剔(访问特定类的特定成员函数),因此您可能需要Attorney-Client Idiom 。不过,我不确定这对构造函数的效果如何。

于 2011-05-28T00:28:02.097 回答
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();
};
于 2011-05-28T00:32:26.143 回答