使内部类成为C ++的朋友

问题描述

| 我想让一个内部类成为一个无关类的朋友,但这似乎不起作用(至少在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; }
    };
};
    

解决方法

        使用前必须先声明“ 1”。以下可能有效。 更新:根据要求忽略可用的演示,这是一种构造可行的方法(减去成员函数的定义),该方法可以起作用,但请记住,一切都是私有的。
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; }
};