2014-01-21 66 views
-2

我有一個類,這是不以任何其他類所擁有,因此通過靜態方法訪問,例如addKeyword()在C++中使用靜態變量

class Foo { 

    public: 

    /* other public methods and such */ 

    static void addKeyword(Keyword& keyword); 

    private: 

    static Foo a; 

    std::vector<Keyword> keywords; 

    /* Foo's private variables and methods */ 

    void addKeywordToObject(Keyword& keyword); 

} 

做這樣的想法是,我可以再調用:

//called from elsewhere in the program 
void Foo::addKeyword(Keyword& keyword){ 
    a.addKeywordToObject(keyword); 
} 

//called from addKeyword() above 
void Foo::addKeywordToObject(Keyword& keyword){ 
    this->keywords.push_back(keyword); 
} 

並且該關鍵字被添加到關鍵字的向量中。

不過 - 我敢肯定有什麼東西我做的根本錯誤 - 當我嘗試編譯這段代碼,我得到的鏈接錯誤:

Undefined symbols for architecture x86_64: "Namespace::Foo::a", referenced from: 
Namespace::Foo::addKeyword(Namespace::Keyword) in Foo.o. 

我有一種感覺,那是因爲我錯誤地使用靜態變量,但我不知道如何或爲什麼。任何人都可以指出我正確的方向嗎?

謝謝!

回答

1

您需要在實現文件中定義static成員。

Foo Foo::a; 
+0

工作正常!你能告訴我爲什麼是這樣嗎? –

1

靜態數據成員,被視爲由編譯器全局變量,並駐留在數據段這樣的(唯一的名字明智的,他們是在類的命名空間,並按照類的公共/私有規則) 。
對於全局變量,類中靜態數據成員的聲明與 extern類似。它告訴編譯器,這個變量存在於某個翻譯單元中。對於最終的符號解析,鏈接器需要在某個翻譯單元中實際查找變量的聲明。