2013-03-17 46 views
1

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

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

'int C :: getAge()'可能会更好。将类中的吸气剂移动。 – WhozCraig 2013-03-17 19:54:05

+0

类的要点是每个实例是分开的。您想要返回哪个实例的“年龄”? – chris 2013-03-17 19:54:08

+0

@WhozCraig我知道,我知道。假设我需要那个职业以外的职能。有没有办法解决我的错误? – FranXh 2013-03-17 19:55:43

回答

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

+0

我的年龄值会改变,所以我不能说它是不变的。我认为使它静态将是最好的方法,但是当我做int C :: age = 0时,我得到这样的错误: C.cpp | 5 |错误:无效使用限定名'C :: age “| – FranXh 2013-03-17 20:09:27

+1

在这里,我为您做了一个工作示例:http://pastebin.com/yR01QYpJ – meyumer 2013-03-17 20:11:32

+0

好吧,我明白它现在的工作原理。谢谢:D – FranXh 2013-03-17 20:14:04

3

不使其静态,你就必须创建一个值:

无论是左值:

C c; 

return c.age; 

或右值:

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

与您的代码的问题是,您尝试访问age成员而不创建该类的实例。类的非静态数据成员只能通过类的实例访问,并且在您的情况下不会创建实例。

+0

我确实有一个构造函数,我声明age = 0 – FranXh 2013-03-17 20:10:42

+1

@FranXh oops。谢谢,我没有看到。 – 0x499602D2 2013-03-17 20:11:18

1

你不能这样做的原因是因为局部变量在运行时被分配到堆栈上 - 如果你真的想要使用一些内联asm,你可以获得它的位置,但它需要一些调试来获得堆栈位置和以后(在函数之后),你想要访问它的可能性会越早被别的东西覆盖。