Я попытался выискивать похожий вопрос на форуме, который мог бы помочь мне без успеха.
У меня есть вложенный класс в моей программе C ++. Я пытаюсь получить доступ к переменной родительского класса из функции во вложенном классе, но столкнулся со следующей ошибкой
ERROR: A non static member reference must be relative to a specific object
Переменная, к которой я пытаюсь получить доступ, защищена, а вложенный класс является общедоступным (как и его функция).
Ниже приведен фрагмент кода, изображающий (или старающийся) сценарий
Заголовочный файл
class A
{
protected:
D x;
public:
int func1(int a);
class B : protected C
{
int func2(int a);
}
}
Файл CPP
int A::func1(int a)
{
x = 5;
B z;
int b = z.func2(a);
}
int A::B::func2(int a)
{
int c = x.getValue(a); /* ERROR: A non static member reference
must be relative to a specific object */
}
Откуда-то
A anObject;
anObject.func1(7);
GetValue () является публичной функцией, если это имеет значение.
Поскольку я вызываю функцию А через объект и через функцию этого Б, разве это не должно быть связано с этим объектом и позволить мне получить доступ к этому нестатическому члену?
C ++ внутренний классы не похожи на вложенные классы Java. Там нет объекта внутри другого. Это просто классы, пространство имен которых является другим классом, как статические внутренние классы Java.
У вас нет доступа к участнику x
поскольку он принадлежит A
Это совершенно не связанный класс, который не имеет ничего общего (наследование, составной и т. д.) B
,
Вы путаете наследование с вложенными классами. Вложенный класс B
данного класса A
это просто класс в A
пространство имен классов. Объект типа B
и объект типа A
и не обязательно связаны друг с другом и не разделяют автоматически функции / объекты-члены.
Когда линия
int c = x.getValue(a);
компилируется, компилятор должен выполнить поиск имени для x
, Это может быть переменная функции, это может быть переменная-член B
, это может быть переменная-член одного из классов, из которых B
наследуется, это может быть глобальная переменная и т. д. Не уверен, почему он решает напечатать сообщение об ошибке только A non static ember reference
, Возможно это делает некоторую эвристическую оценку тем фактом, что x
является переменной-членом A
,
В твоем случае, x
является переменной-членом A
, который не является родительским классом B
, B
это просто вложенный класс в A
, Экземпляр B
может иметь доступ к x
член экземпляра A
, Без экземпляра A
, доступ к x
невозможно из A::B::func2(int a)
,
Из вашего кода не ясно, каков ваш вариант использования. Кажется, вы просто изучаете C ++.
Обновить
В ответ на Откуда-то
Вы не можете позвонить B::func2
от A::func1
без экземпляра B
, B
это вложенный класс A
но пример A
автоматически не имеет экземпляра B
, Если вы добавите
B b;
в качестве переменной-члена в A
, ты можешь использовать:
int A::func1(int a)
{
x = 5;
int c = b.func2(a);
return 0; // Make sure to return something sensible.
}