Доступ к не статическому члену данных вне класса

Можно ли получить доступ к нестатическим членам данных вне их класса? Скажем, у вас есть пример, подобный следующему. Я знаю, что это не имеет большого смысла в качестве примера, но я просто хочу понять, как получить доступ к нестатическому члену данных. Если следующее компилируется, это генерирует ошибку:

 C.h|70|error: invalid use of non-static data member ‘C::age’|

//C.h

class C{
public:
int age;
};
int getAge();

//C.cpp

C::C()
{
age  = 0;
}
int getAge(){
return (C::age);
}

1

Решение

Нестатические члены зависят от экземпляра. Они инициализируются при инициализации действительного экземпляра.

Проблема с вашим примером заключается в том, что он пытается получить доступ к нестатическому члену через интерфейс класса без предварительной инициализации конкретного экземпляра. Это недействительно.

Вы можете сделать это static:

class C{
public:
static int age;
};

который требует от вас также определить age перед использованием во время выполнения: int C::age = 0, Обратите внимание, что значение C::age может быть изменено во время выполнения, если вы используете этот метод.

Или вы можете сделать это const static и непосредственно инициализировать его так:

class C{
public:
const static int age = 0;
};

В этом случае значение C::age является const,

Оба из которых позволят вам получить его без экземпляра: C::age,

3

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

Не делая его статичным, вы должны создать значение:

Либо значение

C c;

return c.age;

или значение:

return C().age;
// or
return C{}.age;

Проблема с вашим кодом в том, что вы пытаетесь получить доступ к age член без создания экземпляра класса. Нестатические члены-данные класса доступны только через экземпляр класса, и в вашем случае экземпляр не создается.

3

Причина, по которой вы не можете этого сделать, заключается в том, что локальные переменные размещаются во время выполнения в стеке — вы можете получить его позицию, если вы действительно этого хотите, с помощью некоторого встроенного asm, но для получения позиции стека потребуется некоторая отладка, а затем (после функция) вы хотите получить к нему доступ, тем более вероятно, что он уже давно будет перезаписан чем-то другим.

1