是否可以访问课堂外的非静态数据成员?假设你有一个如下例子。我知道它作为一个例子没有多大意义,但我只是想了解如何访问非静态数据成员。如果编译以下内容,则会生成错误:
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);
}
答案 0 :(得分:3)
非静态成员依赖于实例。初始化有效实例时会初始化它们。
您的示例的问题在于,它尝试通过类接口访问非静态成员,而无需先初始化具体实例。这是无效的。
您可以将其设为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
。
答案 1 :(得分:3)
如果不将其设为静态,则必须创建一个值:
左值:
C c;
return c.age;
或右值:
return C().age;
// or
return C{}.age;
您的代码的问题是您尝试访问age
成员而不创建类的实例。类的非静态数据成员只能通过类的实例访问,在您的情况下不会创建任何实例。
答案 2 :(得分:1)
你不能这样做的原因是因为局部变量在运行时被分配到堆栈中 - 如果你真的想要使用某些内联asm,你可以获得它的位置但是它需要一些调试才能获得堆栈位置(在函数之后)你想要访问它,它很可能很久就会被其他东西覆盖。