Доступ к нестатическому члену parent из функции вложенного класса

Я попытался выискивать похожий вопрос на форуме, который мог бы помочь мне без успеха.

У меня есть вложенный класс в моей программе 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 () является публичной функцией, если это имеет значение.
Поскольку я вызываю функцию А через объект и через функцию этого Б, разве это не должно быть связано с этим объектом и позволить мне получить доступ к этому нестатическому члену?

3

Решение

C ++ внутренний классы не похожи на вложенные классы Java. Там нет объекта внутри другого. Это просто классы, пространство имен которых является другим классом, как статические внутренние классы Java.

У вас нет доступа к участнику x поскольку он принадлежит AЭто совершенно не связанный класс, который не имеет ничего общего (наследование, составной и т. д.) B,

7

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

Вы путаете наследование с вложенными классами. Вложенный класс B данного класса A это просто класс в A пространство имен классов. Объект типа B и объект типа A и не обязательно связаны друг с другом и не разделяют автоматически функции / объекты-члены.

1

Когда линия

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.
}
1