当我们把类的定义放在头文件中时,为什么链接成功了?
Why is linking successful when we placed definition of class in the header?
我写了以下代码:
//--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.cpp
和b.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的定义。类可以在多个地方声明,但只能在一个地方定义。相关文章:
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 为什么链接器在下面的代码中不发出错误?
- 为什么链接器无法识别此类构造函数?
- 为什么链接器找不到 CppUnit 库?
- 为什么链接需要运算符返回引用
- 为什么链接器在内联构造函数中访问静态成员时失败
- 为什么链接器看不到我的(明确定义的)外部?
- 为什么链接时出现多重定义错误
- 为什么链接器找不到在类中声明的模板函数?
- 为什么链接器不抱怨重复的符号?
- 为什么链接器不抱怨多个函数定义(仅适用于模板化函数)
- 为什么链接器抱怨这个模板中有多个定义
- 为什么链接器在linux中用于编译的路径中搜索库
- 为什么链接库的顺序会导致运行时错误
- 当我们把类的定义放在头文件中时,为什么链接成功了?
- 为什么链接器在这里不产生多个定义错误?
- C++ 为什么链接器看不到我的文件?