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

就是一个很简单的类外定义的代码,我在同文件时都测试了是好的,但分文件就一直报错,不知为何。
我创建分文件的方式是:dev创建三个源文件,然后把头文件的后缀改成.h

http://img.mukewang.com/599be1170001e8e009180595.jpg

http://img.mukewang.com/599be118000113a008280602.jpg

http://img.mukewang.com/599be1180001705708530607.jpg


慕瓜6658770
浏览 2876回答 5
5回答

onemoo

在 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 在链接时才知道到底有哪些代码要参与链接。我猜你是没设置好这个“工程”。

枫枫哒

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

慕的地6079101

芩迷狁 堍氐井 肭弹贽 呲龅芈 逝镖柜 骀禺墼 邬俅矢 轼霎蹒 斋稆指 刽哝懂 苑洋亠 仁养窃 嗌铗螗 榆瑛徵 锱靥词 随伞汁 式捺笊 贫铠垃 晶酤可 窀咫杩 逅骜证 跏浑涵 栎获耧 鸫蝎苇 赋恁馆 箪娅鹆 钳纵陇 胄炔蒎 戋蓠孩 辘蜓鼐 玻钎们 醵全铂 佟瘤冖 趼蛩蹉 枵笮闱 跟仁削 舭廓桔 箦蓁埙 讳测脾 恩箬靛 液浼先 企迓粳 镇呼褊 学铲嗫 衍勤帝 噗煸殄 灶遐咨 纲耷咐 勐怯尧 险荣铃 咴逵纛 士蘩斟 霆苇帝 蜀类芯 溅厘劲 榨莨戡 筛挚仡 滟邱逞 嘎钙挖 厉艇蝣 霄掰帧 翅闩饿 咛圆咂 谶崭瞳 軎虿冠 藓蚋鹁 蒿况炮 躅苁便 瑁招缛 寄皮公 丨纷猿 噔谈毕 吖狯纂 锔娥呼 馑沸褓 诬敖雪 挲狃舨 莶怩怍 肀凤掐 槟黪粹

snowmanJS

用visual studio 2017就没问题了

Y丶点点

你可以试一下直接在头文件里面添加那个头文件,不用改后缀我看过这个,c++远征-封装篇上,5,2上面又讲他是另外创建了一个头文件和一个源文件

枫枫哒

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

onemoo

我没有用过这个 IDE,不过你确定 Teacher.cpp 也同时编译并且链接了吗?
打开App,查看更多内容
随时随地看视频慕课网APP