实现成员函数的正确方法

时间:2015-07-04 19:51:41

标签: c++ linker

我有三个文件 - 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及其更新版本之间的区别,它们似乎完全相同。

为什么第一个变体有链接问题?

3 个答案:

答案 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