2013-05-30 220 views
-1

在下面的代碼:靜態函數和非靜態變量

class A 
{ 
public: 
    static void StaticFunction(int variable){ } 
    void NonStaticFunction() { } 

private: 
    int nonStaticVariable; 
}; 

我需要得到一個「變量」和「NonStaticFunction」

我已經嘗試做「nonStaticVariable」靜態和分配使用它的值爲'變量',但是我仍然必須在'NonStaticFunction'中使用靜態變量,這會引發鏈接器錯誤。

Error 2 error LNK2001: unresolved external symbol "public: static unsigned int A::staticVariable" ([email protected]@@2IA) 

有沒有解決它的辦法?

+0

我不知道你想在這裏實現什麼......你想要的設置爲的所有實例的一些數據類,並且你需要在(non-'static')成員函數中使用這些數據? – BoBTFish

+1

這個錯誤並不是因爲你在一個非靜態函數中使用靜態變量,而是因爲你必須**定義**(即告訴編譯器爲它分配內存而不是聲明它)你的靜態變量通過添加int A :: staticVariable;'在代碼中的某處。 –

回答

4

您需要在命名空間內添加定義您的靜態數據成員

int A::nowStaticVariable; // Put an initializer if 0 is not OK for you 

但是,如果你的靜態函數需要訪問非靜態數據成員,而你被迫使這個數據成員是靜態的,以使整個事情工作,這聞起來像糟糕的設計。考慮重新考慮它。

+0

+1,特別是對於「糟糕的設計」部分。 – Angew

+0

@Angew萬歲winapi和函數指針...;) – Neomex

+0

@Neomex嗯,WinAPI是C,而不是C++。在這種情況下,可以預期的互操作代碼會很難看。 – Angew

2

如果您製作nonStaticVariable靜態;即

static int nonStaticVariable; 

在你的班級,然後你需要爲它提供存儲(或鏈接器會抱怨)。這被稱爲的定義。通過寫

int A::nonStaticVariable; 

有趣的是,這是初始化爲零(未初始化在C和C不像非靜力學++)做在一個源文件。

從概念上講,您需要這樣做,因爲沒有類A的對象實例化靜態變量,因爲它不是實例級數據成員。

1

您不必使用該參數在靜態函數