我有一个任务,我需要读取不同文档中的单词并将它们存储在字符串向量中,我将此向量设置为静态,以便每个文档只是将它们的单词添加到向量中,这样我就可以有一个列表所有的话。 我创建了一个文档类,并在标题中写道:
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);
}
}
然而,这不起作用,每次我尝试构建代码时,它都会给我这个错误消息
"/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)
答案 0 :(得分:2)
此错误消息的即时错误是您已声明document::words
但尚未定义它。它的定义存在于类定义之外,通常在类的翻译单元中。您需要具有如下所示的定义:
static std::vector<std::string> document::words;
那就是说,请注意,静态数据与控制全局数据略微好一点。特别是对于具有共享所有对象的任何内容的并发程序是一个坏主意。如果这个东西是可变的,这是一个更糟糕的想法(顺便说一句,如果全球数据被称为“单身人士”也适用:仅仅因为某些东西据称是一种设计模式并不意味着它在某种程度上得到祝福并且问题消失了距离)。
答案 1 :(得分:0)
从函数定义中删除关键字static
(来自.cpp文件)。
当在函数定义中使用static
时,该单词的含义是该函数仅在当前编译单元中可见(类似于未命名的命名空间)。所以,只需将其从.cpp中删除。
答案 2 :(得分:0)
该行
Undefined symbols for architecture x86_64: "document::words"
告诉你,你的静态数据成员从未真正创建过:你在标题中声明了它,但从未告诉编译器在哪里存储对象。
在您的情况下,这是一个非问题,但在包含相同标题的许多.cpp
文件的较大项目中,重要的是静态对象仅分配一次。
将此行添加到document.cpp
:
vector<string> document::words;
它与全局变量声明完全相同(因为它确实是静态成员),除了作用域名称。