我有三个文件 - main,标题及其'实现':
// main.cpp
#include "word_indexer.h"
int main() {
WordIndexer wd;
cout << wd.size() << endl;
return 0;
}
// word_indexer.h
class WordIndexer {
public:
int size() const; // declaring a function
};
// word_indexer.cpp
class WordIndexer {
public:
int size() const {return 0;}
};
使用g++ -o main main.cpp word_indexer.cpp
构建
对'WordIndexer :: size()const'
的未定义引用
用
替换实现// updated word_indexer.cpp
class WordIndexer {
public:
int size() const;
};
int WordIndexer::size() const {return 0;}
解决了这个问题。
我无法弄清楚这些word_indexer.cpp
及其更新版本之间的区别,它们似乎完全相同。
为什么第一个变体有链接问题?
答案 0 :(得分:3)
无需在其实现文件中重复该类的定义。只需要包含定义类的头文件,然后在实现文件中定义成员函数,如:
// word_indexer.cpp
#include "word_indexer.h"
int WordIndexer::size() const {return 0;}
至于第一个变体不起作用的原因:类中定义的成员函数是隐式的inline
。因此,它们的定义必须存在于使用它们的每个翻译单元中。这就是为什么如果您在头文件中定义类中的成员,这是有效的,但如果您只在另一个.cpp
文件中有内联定义,则不会这样做。
答案 1 :(得分:2)
以下是通常用于课程的方式。
标题(Input | Output
mmo | True
yakak | True
travel | False
):
word_indexer.h
实施(// declare the class and all its methods, member variables, etc.
class WordIndexer {
public:
int size() const; // declaring a function, but not its implementation
};
):
word_indexer.cpp
答案 2 :(得分:1)
在// the implementation basically takes the header "skeleton" and fleshes it out;
// to do that, of course, we need the skeleton first
#include "word_indexer.h"
// we don't need to say "class WordIndexer {}" or anything like that,
// because that's already been done in the header we included
// implement the method
int WordIndexer::size() const {return 0;}
中你应该写下这样的内容:
word_indexer.cpp
这是实际的定义语法。
而不是在翻译单元中重新声明int WordIndexer::size() const {return 0;}
,而只是WordIndexer
。