在声明C ++中实现

时间:2017-06-27 07:30:25

标签: c++

我想在.h文件中包含函数的实现。

我知道我宁愿将声明和实现分别与.h和.c文件分开,这不是我的问题的一部分。

当我在类中实现该函数时,我没有收到任何错误:

class Foo
{
  public:
    // Class constructor
    Foo() { }
};

当我在类外部实现该函数时(仍然在.h文件中):

class Foo
{
  public:
    // Class constructor
    Foo();
};

Foo::Foo()
{
}

我收到以下错误:    Foo:Foo()

的多重定义

有人可以解释一下这背后的逻辑吗?感谢。

2 个答案:

答案 0 :(得分:25)

这是因为在类定义中定义函数时,该方法被视为inline函数。哪些可以包含在多个源文件中,可以编译和链接在一起,并且链接器仍然不会抱怨多个定义。

但是当您在类外定义构造函数时,#include在多个源文件中,将它们一起编译然后链接它们。您可以获得同一功能的多个定义。

请记住,#include文件本质上是该文件的复制粘贴到#include的文件中。因此,每次包含该文件时,您都会获得该源文件中函数的定义。然后,当您编译并链接多个此类源时,您将获得相同非内联函数的多个定义。

有关inline的更多信息,请参阅http://en.cppreference.com/w/cpp/language/inline。示例部分有很多应该有用的代码。

您还可以明确地将类外的定义标记为inline,如@StoryTeller正确指出的那样。

答案 1 :(得分:15)

标记inline

class Foo
{
  public:
    // Class constructor
    inline Foo();
};

inline Foo::Foo()
{
}

Curious said类似,类内定义是隐式内联的。但是如果你在类之外定义它,在标题中,你必须明确地添加说明符。

在这种情况下,内联说明符对于正确链接非常重要。它允许在多个翻译单元中存在相同的功能,只要它是完全相同的功能体。在头文件中定义的函数经常出现的情况。