【问题标题】:make an inner class a friend in C++在 C++ 中使内部类成为朋友
【发布时间】:2011-06-15 13:43:32
【问题描述】:

我想让一个内部类成为一个不相关类的朋友,但这似乎不起作用(至少在 gcc 4.1.2 中):

class A {
    int i;
    friend class B; // fine
    friend class B::C; // not allowed?
};

class B {
    int geti(A* ap) { return ap->i; }

    class C {
        int geti(A* ap) { return ap->i; }
    };
};

【问题讨论】:

  • 代码中有很多基本错误,请先修复这些错误:没有“B::C::geta()”,“A::i”是私有的。 “B::C::geti()”是私有的。
  • 忽略主函数即可。
  • "忽略主函数即可。"极好的。当你告诉链接器时它起作用了吗?
  • 好的——但是下次再做一个额外的步骤,制作+测试一个除了问题之外什么都没有显示的例子。并记住最终“接受”答案以获得良好的业力:-)

标签: c++ gcc friend inner-classes


【解决方案1】:

您必须在使用之前声明B::C。以下可能有效。

更新:忽略所要求的可用演示,这是一种可以工作的结构化方法(减去成员函数的定义),但请记住,一切都是私有的。

class A;

class B
{
  int geti(A * ap);

public:
  class C
  {
    int geti(A * ap);
  };
};

class A
{
  friend class B;    // fine
  friend class B::C; // fine too
  int i;
};

然后在别处定义getter函数:

int B::geti(A * ap) { ... }
int B::C::geti(A * ap) { ... }

替代方案:前向声明嵌套类B::C 并保存一个外部定义:

class A;

class B
{
  int geti(const A * ap) const; // we cannot use A yet!

public:
  class C;
};

class A
{
  friend class B;    // fine
  friend class B::C; // fine too
  int i;
};

int B::geti(const A * ap) const { return ap->i; }

class B::C
{
  inline int geti(const A * ap) const { return ap->i; }
};

【讨论】:

  • 好的,谢谢,但是真的没有办法通过class B::C; 来声明B::C,就像我们可以通过class B; 声明B 一样吗?不得不将吸气剂放在其他地方很烦人。
  • 我发布了一个替代方案,但我不知道这是否更好。
  • @dave - 不,您不能这样声明嵌套名称。在class B::C 中,B 是类还是命名空间?
  • @BoPersson:要么声明了,要么没有声明。不幸的是,即使您说class B; class B::C,也不允许这样做。 C++ 不允许在未定义包含类的情况下前向声明成员。
猜你喜欢
  • 2011-06-28
  • 1970-01-01
  • 2010-09-19
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多