【问题标题】:recursive friend classes递归朋友类
【发布时间】:2011-05-28 00:03:53
【问题描述】:

有没有办法解决这个问题:

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’

【问题讨论】:

  • 我认为你能得到的最接近的是friend class B
  • 你到底想要做什么,你需要 B 和 C 的构造函数对彼此可见?
  • @Mike,这实际上是一个综合示例。实际情况是,出于复杂的原因,我不能允许对 C 的依赖强制依赖于 B 的定义。

标签: c++ friend friend-class


【解决方案1】:

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

【讨论】:

  • 您可以递归地为整个班级授予友谊,但不能授予个别成员。
【解决方案2】:

根据IBM's documentation(我意识到这不是规范):

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

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

当然,你可以使用

friend class B;

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我意识到这是一个非常愚蠢的想法,但你不能——理论上——通过继承来实现这一点,让父类的构造函数成为朋友吗?代码编译,至少,虽然它可能是有问题的。

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

      【讨论】:

      • 我认为友谊不能被继承...... C不是B的朋友,B不是C的朋友......
      • 友谊绝对不是遗传的。
      • 是的。但是如果你只是想让构造函数访问私有变量,这将使 B 和 C 的父类的构造函数可以访问 B 和 C 中的私有数据——它们可以分别被 B 和 C 的构造函数调用——即使 B 和C 不能直接访问彼此的私有数据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2012-12-04
      • 2011-08-10
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多