2013-03-17 47 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,你可以獲得它的位置,但它需要一些調試來獲得堆棧位置和以後(在函數之後),你想要訪問它的可能性會越早被別的東西覆蓋。