Можно ли получить доступ к нестатическим членам данных вне их класса? Скажем, у вас есть пример, подобный следующему. Я знаю, что это не имеет большого смысла в качестве примера, но я просто хочу понять, как получить доступ к нестатическому члену данных. Если следующее компилируется, это генерирует ошибку:
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);
}
Нестатические члены зависят от экземпляра. Они инициализируются при инициализации действительного экземпляра.
Проблема с вашим примером заключается в том, что он пытается получить доступ к нестатическому члену через интерфейс класса без предварительной инициализации конкретного экземпляра. Это недействительно.
Вы можете сделать это 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
,
Не делая его статичным, вы должны создать значение:
Либо значение
C c;
return c.age;
или значение:
return C().age;
// or
return C{}.age;
Проблема с вашим кодом в том, что вы пытаетесь получить доступ к age
член без создания экземпляра класса. Нестатические члены-данные класса доступны только через экземпляр класса, и в вашем случае экземпляр не создается.
Причина, по которой вы не можете этого сделать, заключается в том, что локальные переменные размещаются во время выполнения в стеке — вы можете получить его позицию, если вы действительно этого хотите, с помощью некоторого встроенного asm, но для получения позиции стека потребуется некоторая отладка, а затем (после функция) вы хотите получить к нему доступ, тем более вероятно, что он уже давно будет перезаписан чем-то другим.