внутренние классы — C ++: открытый член закрытого типа вложенного класса

У меня есть следующий код:

class Base
{
private:
class NestedBase
{
public:
void Do() {}
};

public:
NestedBase nested;
};

int main()
{
Base b;
b.nested.Do(); // line A compiles
Base::NestedBase instance; // line B doesn't compile
}

NestedBase класс является частным вложенным классом Base, поэтому кажется естественным, что строка B не компилируется. Но, с другой стороны, переменная b имеет публичного члена nestedи я могу вызвать его метод Do() снаружи Base (как в строке A). Каковы точные правила, регулирующие доступ к частному вложенному классу (или его членам) в таком случае? Что стандарт говорит об этом?

8

Решение

Согласно стандарту, $ 11,7 / 1 Вложенные классы [class.access.nest]:

Вложенный класс является членом, и поэтому имеет те же права доступа, что и любой другой член.

Итак, все довольно просто. NestedBase это private член класса Base, так Base::NestedBase не могут быть доступны в main(),

b.nested.Do(); хорошо, потому что nested а также Do() оба public члены. Дело в том, что NestedBase это private вложенный класс Base не имеет значения, это не имеет значения здесь.

6

Другие решения

Введите имя NestedBase является частным членом класса.

class Base
{
private:
class NestedBase
{
public:
void Do() {}
};
//...

Таким образом, вы не можете явно получить к нему доступ вне класса, в котором объявлено имя.

Но вы можете получить доступ к имени неявным образом следующим образом 🙂

decltype( Base::nested) instance;
2