【问题标题】:C++: Defining class in multiple filesC++:在多个文件中定义类
【发布时间】:2019-06-12 03:37:05
【问题描述】:

根据One Definition Rule (ODR)

在整个程序中,一个对象或非内联函数不能有 不止一个定义;如果使用一个对象或函数,它必须 只有一个定义。

这些是我正在尝试编译的文件:

A.cpp

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

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

B.cpp

#include "Greet.h"

问候.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"

问候.h

#include <iostream>

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

为什么链接器没有抱怨Greet 类的多个定义?

MSVC 和 g++ 的行为相同。

【问题讨论】:

    标签: c++ one-definition-rule


    【解决方案1】:

    但是当我把greet() 函数放在一个类中时。代码编译良好并给出输出Hello World!

    在类定义中定义成员函数时,隐含inline。对于非成员函数,情况并非如此。

    来自C++ Standard, class.mfct

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

    【讨论】:

    • 那么,如果我将每个函数都定义为类中的成员函数,那么链接不会有任何问题吗?那么,为什么建议将 C++ 类的声明和定义分开到单独的头文件和 cpp 文件中呢?
    • @AdityaVerma,在 .cpp 中实现成员函数允许您在不更改头文件的情况下灵活地更改实现——这是封装的基本原则。
    • 为什么我们不想改变头文件呢?我无法理解它与封装有何关系。
    • @AdityaVerma,这里不适合回答这个问题。请浏览网络,查找并阅读一本关于软件工程的好书,或在softwareengineering.stackexchange.com 提出问题
    • 这是将类分离为头文件和源文件的基本原理:softwareengineering.stackexchange.com/a/320036/338457
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    相关资源
    最近更新 更多