C ++:在多个文件中定义类

时间:2019-06-12 03:37:05

标签: c++ one-definition-rule

根据One Definition Rule (ODR)

  

在整个程序中,对象或非内联函数不能具有   一个以上的定义;如果使用对象或功能,则必须   有一个定义。

这些是我要编译的文件:

A.cpp

#include <iostream>
#include "Greet.h"

int main()
{
    greet();
    std::cin.get();
}

B.cpp

#include "Greet.h"

Greet.h

#include <iostream>

void greet()
{
    std::cout << "Hello World!" << std::endl;
}

我收到预期的链接器错误:

fatal error LNK1169: one or more multiply defined symbols found.

但是当我将greet()函数放在一个类中时。代码可以正常编译,并提供输出Hello World!

A.cpp

#include <iostream>
#include "Greet.h"

int main()
{
    Greet G;
    G.greet();

    std::cin.get();
}

B.cpp

#include "Greet.h"

Greet.h

#include <iostream>

class Greet
{
public:
    void greet()
    {
        std::cout << "Hello World!" << std::endl;
    }
};

为什么链接程序不会抱怨类Greet的多个定义?

MSVC和g ++的行为相同。

1 个答案:

答案 0 :(得分:6)

  

但是当我将greet()函数放在一个类中时。代码可以正常编译,并提供输出Hello World!

在类定义中定义成员函数时,将暗示inline。对于非成员函数而言并非如此。

来自C++ Standard, class.mfct

  

成员函数可以在其类定义中定义([dcl.fct.def]),在这种情况下,它是 inline 成员函数([dcl.fct.spec]),或者如果已经声明但未在其类定义中定义它,则可以在其类定义之外定义它。