Подтвердить что ты не робот

Возможно ли совместить класс в анонимном пространстве имен на С++?

Я переношу код с Java на С++, и я хотел бы воспроизвести некоторые анонимные функции.

В файле A.h у меня есть:

class A
{
private:
  int a;

  class AnonClass;
  friend class AnonClass;
};

В файле A.cpp у меня есть:

namespace
{
  class AnonClass
  {
  public:
    AnonClass(A* parent)
    {
      parent->a = 0; // This doesn't work, a is not accessible
    }
  }
}

Возможно ли совместить класс в анонимном пространстве имен на С++?

В Java вы можете объявить анонимные классы, чтобы это было очень похоже. Также он не будет подвергать AnonClass клиентам A.h

4b9b3361

Ответ 1

Менее известная альтернатива заключается в том, чтобы сделать класс Anon членом класса A. Внутри класса A вам нужна строка class Anon; - нет реального кода, нет объявления друга. Обратите внимание, что он идет в классе A, почти так же, как в Java. В файле .cpp вы пишете все подробности об Anon, но вы помещаете его не в анонимное пространство имен, а внутри A::

  class A::Anon { ..... };

Вы можете разделить объявление и реализацию A:: Anon, как обычно, просто помните, всегда добавляйте A:: в Anon.

Класс Anon является членом A и как таковой получает доступ ко всем другим членам A. Тем не менее он остается неизвестным клиентам A и не загромождает глобальное пространство имен.

Ответ 2

Насколько я вижу, вы не можете. Причины:

  • "Анонимное" пространство имен доступно только в файле, в котором вы его создали.
  • Вы должны определить весь класс AnonClass, и он функционирует в одном пространстве имен, то есть в одном месте в программе.
  • Класс A должен быть определен перед конструктором AnonClass.
  • AnonClass должен быть объявлен как минимум до класса A.

Итак, вы видите, что нельзя разбить определение AnonClass на две части. И вы не можете определить его как до, так и после класса A.

Единственный вариант - поместите класс A в одно и то же анонимное пространство имен. Этот код работает:

namespace 
{
  class A
  {
   public:
    A():a(0){};
   private:
    int a;

    friend class AnonClass;
  };

  class AnonClass
  {
  public:
    AnonClass(A* parent);
  };

  AnonClass::AnonClass(A* parent)
  {
      parent->a = 0;
  };
}

int main() {
  A a;

  return 0;
}

Надеюсь, это поможет.