当我们在标题中放置类的定义时,为什么链接成功?

时间:2014-05-06 11:33:11

标签: c++ include c-preprocessor

我写了以下代码:

//--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

1 个答案:

答案 0 :(得分:0)

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

您不希望将A类的定义放在两个文件中。类可以在多个位置声明,但必须只在一个中定义