为了账号安全,请及时绑定邮箱和手机立即绑定

求问:这个c++分文件类外定义毛病在哪儿?

求问:这个c++分文件类外定义毛病在哪儿?

C++
慕瓜6658770 2017-08-22 15:47:55
就是一个很简单的类外定义的代码,我在同文件时都测试了是好的,但分文件就一直报错,不知为何。 我创建分文件的方式是:dev创建三个源文件,然后把头文件的后缀改成.h
查看完整描述

5 回答

?
onemoo

TA贡献883条经验 获得超454个赞

在 C/C++ 中,程序代码要经过“编译”和“链接”后才能形成可执行程序。 

编译:

一个源代码文件经过编译器编译后会生成带有可执行代码的文件(也就是编译器把你写的程序代码翻译为可运行的机器码),我这里说的源代码文件就是指 .cpp .c 之类的。这样被分别独立编译的代码一般被叫做一个“编译单元”。

你知道一个程序很可能有多个源代码文件,所以显然只这一个源代码文件生成的可执行代码是无法构成可完整运行的程序的。


链接:

当然了,每一个源代码文件都会经过编译器的编译,都生成了相应的可执行代码片段。有人称之为“中间文件”“过程文件”等,其文件名后缀在不同编译器下也不一样,微软的编译器生成的是 .obj,gcc 生成的是 .o。

前面说过一个编译单元生成的 .o 文件无法完整运行当然是因为 其中可能引用了其他编译单元中的变量 或者 调用了其他编译单元中的函数。所以为了能生成最终的可执行程序,就需要把这些编译单元的 .o 文件进行“链接”。

这是由链接器来处理的,它会找到不同编译单元中互相引用或互相调用的代码,处理好它们,并最终生成可执行程序。


以上就是你写的代码经过“编译”和“链接”生成可执行程序的过程。


所以你遇到的错误其实不是编译错误,而是链接错误。

你的 IDE 试图把 类外定义2.cpp 编译后就生成可执行程序,于是链接器就报了“找不到 getName 函数”等错误——因为这些函数是定义在另一个编译单元(Teacher.cpp)中的嘛。 同理,你在单独编译 Teacher.cpp 后链接器报的错是找不到 main 函数。

其实你需要把这两个编译单元(类外定义2.cpp 和 Teacher.cpp)的编译结果都交给链接器,而具体如何“交给”是你的 IDE 的事。

 就像我在前面回答中所说,一般 IDE 都会以“工程”为单位来组织代码。你要把所有源码都放到“工程”中,这样 IDE 在链接时才知道到底有哪些代码要参与链接。

我猜你是没设置好这个“工程”。

查看完整回答
2 反对 回复 2017-08-22
?
枫枫哒

TA贡献11条经验 获得超8个赞

还有一种更简便的方法,就是文件引用teacher.cpp,不引入teacher.h

查看完整回答
2 反对 回复 2017-08-22
  • 天将明96
    天将明96
    别人要的就是这种分文件的形式啊,这是跟着老师做实验
?
snowmanJS

TA贡献89条经验 获得超53个赞

用visual studio 2017就没问题了

查看完整回答
反对 回复 2017-08-23
?
Y丶点点

TA贡献1条经验 获得超0个赞

你可以试一下直接在头文件里面添加那个头文件,不用改后缀

我看过这个,c++远征-封装篇上,5,2上面又讲

他是另外创建了一个头文件和一个源文件

查看完整回答
反对 回复 2017-08-22
?
枫枫哒

TA贡献11条经验 获得超8个赞

因为teacher.h中其实是没有包含teacher.cpp里的内容的,所以在最后main函数里会提示没有定义函数,需要把teacher.cpp里的函数拷贝到teacher.h里,之后再补全main里面用到的引用函数就可以运行

查看完整回答
反对 回复 2017-08-22
  • 慕瓜6658770
    慕瓜6658770
    我把Teacher.cpp的放到Teacher.h里了,可以正常运行。但是我看的慕课网的教程里,老师就是把类的声明和定义放在两个文件呀,我这个形式和老师完全一样哇,(老师用的另一个编译器)
  • 枫枫哒
    枫枫哒
    可以直接引用cpp文件,不引用h文件,这样就可以。因为cpp文件里同时包含了h文件以及函数声明
  • 慕瓜6658770
    慕瓜6658770
    我按照你这个是好的,但是这样就不算分文件类外定义了吧,而且,为什么老师的代码是主函数#include <Teacher.h>可以呢
点击展开后面3
?
onemoo

TA贡献883条经验 获得超454个赞

我没有用过这个 IDE,不过你确定 Teacher.cpp 也同时编译并且链接了吗?

查看完整回答
反对 回复 2017-08-22
  • 慕瓜6658770
    慕瓜6658770
    同时编译是啥意思? Teacher编译的时候也是报同样的错。。
  • 慕瓜6658770
    慕瓜6658770
    哦哦 我同时编译了,还是一样的错
  • onemoo
    onemoo
    我刚才说“同时”指的是这两个cpp都要编译并且要链接在一起,先别管我的用词问题了。 你贴图中的报错是在编译"类外定义2.cpp"时报的,那么你说的“Teacher编译的时候也是报同样的错”是什么意思? 你单独编译 Teacher.cpp 时也会报错吗?
点击展开后面5
  • 5 回答
  • 1 关注
  • 3013 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信