亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求問:這個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 關注
  • 3229 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號