Memberspaces могут получить доступ к закрытым членам родительского класса

Я читаю Эта статья, и какое-то время играл с идиомой memberspace, когда заметил что-то, что удивило меня в этом фрагменте (который компилируется без проблем: http://ideone.com/hRiV5B):

class HugeClass
{
public:
struct memberspace
{
int f() const { return parent.f; }

private:
friend HugeClass;
explicit memberspace(HugeClass & parent)
: parent(parent) {}
HugeClass & parent;
} memberspace;

HugeClass() : memberspace(*this), f(42) {}

private:
int f;
};

Я бы ожидал ошибку компилятора, что доступ HugeClass::f не допускается, потому что f является частным в этом контексте.

HugeClass это friend из memberspace, так HugeClass может вызвать частный конструктор memberspace, но почему это работает наоборот без явного объявления memberspace friend из HugeClass?

5

Решение

По правилам языка в C ++ 11.


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

class E {
int x;
class B { };
class I {
B b; // OK: E::I can access E::B
void f(E* p, int i)
{
p->x = i; // OK: E::I can access E::x
}
};
};

А в С ++ 03 было


Члены вложенного класса не имеют специального доступа ни к членам включающего класса, ни к классам или
функции, которые подарили дружбу окружающему классу; обычные правила доступа (пункт 11)
повиновался.

Итак, пример из C ++ 11 не должен работать с компиляторами c ++ 03.

6

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

memberspace это часть HugeClass и имеет такой же доступ, как и другие члены класса.

1

По вопросам рекламы [email protected]