访问类外的非静态数据成员

时间:2013-03-17 19:52:36

标签: c++ non-static datamember data-members

是否可以访问课堂外的非静态数据成员?假设你有一个如下例子。我知道它作为一个例子没有多大意义,但我只是想了解如何访问非静态数据成员。如果编译以下内容,则会生成错误:

 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);
}

3 个答案:

答案 0 :(得分:3)

非静态成员依赖于实例。初始化有效实例时会初始化它们。

您的示例的问题在于,它尝试通过类接口访问非静态成员,而无需先初始化具体实例。这是无效的。

您可以将其设为static

class C{
public:
    static int age;
};

要求您在运行时使用之前定义ageint 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,你可以获得它的位置但是它需要一些调试才能获得堆栈位置(在函数之后)你想要访问它,它很可能很久就会被其他东西覆盖。