内联构造函数?解释这种行为[C ++]

时间:2010-06-26 15:02:26

标签: c++ inline-method

考虑这段代码

#include <iostream> 
#include <cstdio>
using namespace std;

class Dummy {
public:
    Dummy();
};

inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

int main() {
    Dummy d;
}

这里一切都很好!

现在我做这个修改。我把Dummy的声明移到了“dummy.h”。

class Dummy {
public:
    Dummy();
};

在“dummy.cpp”中定义构造函数Dummy(),如下所示

#include "dummy.h"
inline Dummy::Dummy() {
    printf("Wow! :Dummy rocks\n");
}

最后,我的主文件为:

#include <iostream> 
#include <cstdio>
#include "dummy.h"
using namespace std;

int main() {
    Dummy d;
}

它编译得很好,但是我收到一个链接器错误抱怨对Dummy :: Dummy()的未定义引用。

任何见解。

-

3 个答案:

答案 0 :(得分:3)

您必须将所有内联函数(包括方法和构造函数/析构函数)放在头文件中,并在其中声明它们。

虽然此代码应该以任何一种方式运行,main()调用构造函数,就好像inline关键字不存在一样。您确定要将目标文件从两个编译单元传递到链接器吗?

答案 1 :(得分:2)

您应该考虑编译是如何在C ++中工作的,以及在C ++中使用的单独编译单元以及使用头文件和cpp文件获得的封装的想法。

看这里: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6

内联告诉编译器,而不是调用函数在函数调用的位置“复制 - 粘贴”其代码。当您将内联定义放在CPP文件中时,在链接到其他编译单元(它在cpp文件中而不是在h文件中)时它将不可见,因此编译器可以从类中放置的签名中了解到没有参数Con的所以它不会实现默认的。但链接器无法找到函数体,因为它在cpp文件中实现了 inline

答案 2 :(得分:0)

尝试从实现文件中删除内联说明符。如果我的理解是正确的,你只能在标题中内嵌