2012-02-06 76 views
1

我有一個任務,我需要從不同的文檔中讀取單詞,並將它們存儲在一個字符串矢量中,我將這個矢量設置爲靜態,以便每個文檔都將它們的單詞添加到矢量中,以便我可以有一個所有的話。 我犯了一個文檔類,並在標題中我寫道:在C++中使用靜態屬性?

class document { 
public: 

    document(string filename); 

    static vector<string> words; 
    string name; 
    vector<int> frequency; 
    void getFrequency(); 
    static void addWord(string wordd); 
在document.cpp文件

實現addWord方法有以下:

static void document::addWord(string wordd){ 


    vector<string>::iterator i = find(words.begin(), words.end(), wordd); 

    if (i == words.end()) { 
     words.push_back(wordd); 
    } 
} 

但是每次都不起作用,我嘗試建立它給了我此錯誤消息函數的定義(從.cpp文件)

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf "/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/assignment1 mkdir -p build/Debug/GNU-MacOSX rm 
-f build/Debug/GNU-MacOSX/main.o.d g++ -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp mkdir -p dist/Debug/GNU-MacOSX g++  -o dist/Debug/GNU-MacOSX/assignment1 build/Debug/GNU-MacOSX/main.o Undefined symbols for architecture x86_64: "document::words", referenced from: 
     document::getFrequency()  in main.o 
     document::addWord(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)in main.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status make[2]: *** [dist/Debug/GNU-MacOSX/assignment1] Error 1 make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 


BUILD FAILED (exit value 2, total time: 1s) 
+1

你只需*聲明*'document :: words',你還需要*在你的cpp文件中定義*它。 – 2012-02-06 16:27:37

+1

文檔不存儲自己的單詞是毫無意義的。基本上這個問題根本不需要文檔類(因爲它不代表文檔),並且看到你想查詢單詞的頻率,地圖會更合適。 – UncleBens 2012-02-06 16:35:42

回答

0

刪除關鍵字static的代碼。

當在函數定義中使用static時,該單詞的含義是該函數僅在當前編譯單元中可見(類似於未命名的名稱空間)。所以,只需從.cpp中刪除它。

+0

只是爲了澄清,這是不正確的。問題是關於一個靜態成員,但靜態方法也是有效的:它們與非靜態方法具有相同的範圍和訪問權限,但不與實例關聯(因此可以不帶任何對象調用它們)。 – Useless 2012-02-07 11:39:06

+0

嗯,現在我讀了構建輸出,我發現我給出了錯誤的答案。但是,AFAIK,'addWord'方法的聲明應該有static關鍵字,但定義不應該。我相信,在定義了'document :: words'之後,應該彈出另一個關於缺少document :: addWord()的鏈接器錯誤。 – Dialecticus 2012-02-07 15:36:41

2

此錯誤消息的即時錯誤是您已聲明document::words但您尚未定義它。這個定義不在類定義之外,通常在類的翻譯單元中。你需要有定義,看起來是這樣的:

static std::vector<std::string> document::words; 

這就是說,請勿靜態數據是很像稍好控制全局數據。特別是在併發程序中,任何共享所有對象的東西都是一個壞主意。如果這個東西是可變的,這是一個更糟糕的想法(順便說一句,如果全球數據被稱爲「單身人士」,這也適用:僅僅因爲據稱某種設計模式並不意味着它在某種程度上是幸運的並且問題已經消失遠)。

0

Undefined symbols for architecture x86_64: "document::words" 

告訴你,你的靜態數據成員從未實際創建:您在頭部聲明,但從來沒有告訴編譯器在何處存儲對象。

這對你來說不是問題,但是在一個包含許多文件的較大項目中,包括相同的頭文件,重要的是靜態對象只能分配一次。

此行添加到document.cpp

vector<string> document::words; 

它酷似一個全局變量聲明(因爲這是一個真正的靜態成員是什麼),除了範圍的名稱。