сделать внутренний класс другом в C ++ - PullRequest
0 голосов
/ 15 июня 2011

Я хочу сделать внутренний класс другом не связанного класса, но, похоже, это не сработает (по крайней мере, в 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 Ответ

3 голосов
/ 15 июня 2011

Вы должны объявить 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;
};

Затем определите функции получения в другом месте:

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; }
};
...