当我们把类的定义放在头文件中时,为什么链接成功了?

Why is linking successful when we placed definition of class in the header?

本文关键字:为什么 链接 成功 文件 我们 定义      更新时间:2023-10-16

我写了以下代码:

//--a.cpp--//
#include "base.h"

class B : public A
{
public:
    void foo()
    {
        A::bar();
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    B *b= new B();
    b->foo();
    return 0;
}
//--b.cpp--//
#include "base.h"
void A::bar()
{
        printf("class A");
}

//--base.h--//
class A
{
public:
    void bar();
};

它起作用了。但我不明白为什么它能正常工作,但是当我们把class A定义放入a.cppb.cpp而不是base.h时,它就不能工作了。我认为在预处理阶段之后,在编译到对象模块之前,base.h只是替换为base.h的内容。在编译阶段之前,我们还对class A进行了重新定义。

a.p p和b.p p都需要访问类A的声明(这是您在base.h中拥有的)。我将a.cpp和b.cpp顶部的base.h(声明)的内容复制粘贴,在Visual Studio 2012中编译良好。

您不希望在两个文件中都放置类A的定义。类可以在多个地方声明,但只能在一个地方定义