Возможно ли совместить класс в анонимном пространстве имен на С++?
Я переношу код с 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
Ответы
Ответ 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;
}
Надеюсь, это поможет.