2012-02-06 41 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; 

它酷似一个全局变量声明(因为这是一个真正的静态成员是什么),除了范围的名称。