class Outer {
class Inner {
public:
Inner() {}
void func() ;
};
private:
static const char* const MYCONST;
int var;
};
void Outer::Inner::func() {
var = 1;
}
const char* const Outer::MYCONST = "myconst";
Эта ошибка возникает, когда я компилирую с классом Outer :: Inner 'не имеет члена с именем `var'
c++
inner-classes
кал
источник
источник
Внутренний класс имеет доступ ко всем членам внешнего класса, но не имеет неявной ссылки на экземпляр родительского класса (в отличие от некоторых странностей с Java). Итак, если вы передадите ссылку на внешний класс внутреннему классу, он может ссылаться на что угодно во внешнем экземпляре класса.
источник
Все, что является частью Outer, должно иметь доступ для всех участников Outer, публичных или частных.
Изменить: ваш компилятор правильный, var не является членом Inner. Но если у вас есть ссылка или указатель на экземпляр Outer, он может получить к нему доступ.
источник
var не является членом внутреннего класса.
Для доступа к var следует использовать указатель или ссылку на экземпляр внешнего класса. например, pOuter-> var будет работать, если внутренний класс является другом внешнего, или var является общедоступным, если он строго следует стандарту C ++.
Некоторые компиляторы относятся к внутренним классам как к друзьям внешних, а некоторые - нет. См. Этот документ для компилятора IBM :
"Вложенный класс объявляется в рамках другого класса. Имя вложенного класса является локальным для его включающего класса. Если вы не используете явные указатели, ссылки или имена объектов, объявления во вложенном классе могут использовать только видимые конструкции, включая имена типов, статические члены и перечислители из включающего класса и глобальных переменных.
Функции-члены вложенного класса следуют обычным правилам доступа и не имеют специальных прав доступа к членам их включающих классов. Функции-члены включающего класса не имеют специального доступа к членам вложенного класса ".
источник
friend
илиpublic
. Кого волнует, что IBM ошибалась / устарела в прошлом при неработающей ссылке? Этот ответ уже устарел за 3 года до публикации.Прежде всего, вы пытаетесь получить доступ к нестатическому члену
var
вне класса, что недопустимо в C ++.Ответ Марка правильный.
Таким образом, вы можете сделать две вещи: либо объявить
var
как,static
либо использовать ссылку на экземпляр внешнего класса для доступа к 'var' (поскольку дружественный класс или функция также нуждаются в ссылке для доступа к частным данным).Статический var
Измените
var
на,static
если вы не хотите,var
чтобы вас связывали с экземплярами класса.Выход- var: 1
Нестатическая переменная
Ссылка на объект должна обращаться к любым нестатическим переменным-членам.
Выход- var: 1
Изменить - внешние ссылки - это ссылки на мой блог.
источник