2009-12-29 15 views
6

我有一個名爲的東西有點類,我想存儲的東西。這些東西是int類型的列表。在我使用的任何類的代碼中,我希望能夠在Stuff類中訪問這些東西。當我的類有靜態成員時,爲什麼我的C++程序不會鏈接?

Main.cpp的:

#include "Stuff.h" 

int main() 
{ 
    Stuff::things.push_back(123); 
    return 0; 
} 

Stuff.h:

#include <list> 

class Stuff 
{ 
public: 
    static list<int> things; 
}; 

,但我得到這個代碼的一些構建錯誤:

錯誤LNK2001:無法解析的外部符號「公:靜態類的std ::名單< INT,一流的std ::分配器<INT> > Stuff :: things「(?things @ Stuff @@ 2V?$ list @ HV?$ allocator @ H @ std @@@ std @@ A)Main.obj CSandbox

致命錯誤LNK1120:1個未解析的外部C :\東西\項目\ CSandbox \調試\ CSandbox.exe CSandbox

我是一個C#人,我正在嘗試學習C++的一個副項目。我認爲我不明白C++如何對待靜態成員。所以請解釋我在這裏得到的錯誤。

+0

我可能在政治上建議您嘗試格式化您的代碼示例嗎? :-) – stiank81 2009-12-29 21:18:37

+0

我會,如果我知道如何,但我注意到,格雷格很友好地爲我做 – 2009-12-29 22:10:24

+0

我打算把我的答案和...... 2個新答案。只是因爲我知道它。 – Hai 2009-12-29 22:11:25

回答

15

在類聲明提起靜態部件是聲明只。您必須包括靜態成員之一定義爲鏈接一切正常掛鉤。通常你會包括像在Stuff.cpp文件中的以下內容:

#include "Stuff.h" 

list<int> Stuff::things; 

一定要包括Stuff.cpp在你的程序與Main.cpp一起。

+0

@Greg - 應該是'列表東西::東西;' – 2009-12-29 21:20:33

+0

謝謝,只是注意到並修復:) – 2009-12-29 21:21:49

7

靜態數據成員必須類聲明外定義,很像方法。

例如:

class X { 
    public: 
     static int i; 
}; 

還必須具備以下條件:

int X::i = 0; // definition outside class declaration 
4

東西::東西只聲明,但沒有定義。

請使用:

// Stuff.cpp 
#include "Stuff.h" 

std::list<int> Stuff::things; 

新增:這也是一個很好的做法,以保護你的頭文件針對多個包含:

// Stuff.h 
#ifndef STUFF_H_ 
#define STUFF_H_ 

#include <list> 

class Stuff { 
    public: 
     static std::list<int> things; 
}; 

#endif 
0

靜態成員在類中聲明,但在單元(cpp文件)中定義的位置。

唯一的例外是在情況下,類是模板:在這種情況下,你必須定義類之外的成員,但你必須提供它也與類的聲明,在頭文件。

2

只是爲了您的信息,爲什麼這個工作原理是在C++中,所有全局變量(包括靜態全局變量)都是在主函數執行開始之前創建的。

相關問題