C 常見編譯和執行期錯誤

2021-09-29 15:43:35 字數 1368 閱讀 3253

原因分析:父類中的虛函式只有宣告,沒有定義。

解決方案:

1.定義相關的虛函式的實現

2.定義成純虛函式留給後代實現,virtual int broadcast(const char* pbuf, const unsigned bufsize) = 0

原因之一,當前使用者對檔案沒有相應許可權

原因之一:子類已析構,呼叫父類的純虛函式

問題原因:棧溢位,如下所示,當寫入head的字串大於128位元組時,就會導致此錯誤。

char head[

128]

;head[

129]

='a'

;

注意:當出現這個問題時,程式會繼續執行;但是在函式返回時會出現錯誤提示,程式退出。

如果類a中用到了類b,而類b的用到了類a,這時便需要用到類的前置說明 ,但需要注意的是:前置宣告只能作為指標或引用,不能定義類的物件,自然也就不能呼叫物件中的方法了。

解決方案:

將類的宣告和類的實現(即類的定義)分離,在實現檔案中引用需要的標頭檔案。

列舉型別和巨集重名

傳統程式設計方法(在*.**件宣告,在*.cpp檔案中定義)用於模板,編譯時會出現未定義的錯誤。

c++編譯以原始檔為單位,每乙個物件所占用的空間大小,是在編譯的時候就確定的。而模板當然不是資料型別,模板就是模板,模板有個具現化的過程,在模板類被使用的之前,編譯器無法知道模板類物件的大小,因而不會生成二進位制檔案。

template void test(t a);

#include」test.h」

template void test(t a)

#include」test.h」

int main()

編譯main.cpp時,對test的呼叫會展開模板的具現化,但是編譯器在test.**件中只看到了模板的宣告,沒有模板的定義,因此編譯器不能建立型別test(int), 不過這時並不報錯,編譯器認為模板定義在其它檔案中,就把問題留給鏈結程式處理。

編譯器編譯test.cpp時也不會生成函式的二進位制**,因為要生成**,需要知道模板引數,即需要乙個型別,而不是模板本身。因此當鏈結器去鏈結main.obj和test.obj時就會報出未定義的錯誤。

了解了問題本質,就清楚了解決問題的方法:在模板具現化時讓編譯器看到模板定義。

templateclass a

; #include//test_impl.h

templatevoid a::test(t a)

#include」test.h」

int main()

c 有關編譯期和執行期的訪問

include using namespace std class a 出現了很有趣的結果,在main函式中,訪問到了b類中的私有方法。為什麼會出現這樣的結果呢?一般來說外部物件訪問類的私有成員,除非是友元,否則在編譯的時候就會報錯,但是上面那段 卻可以正常的編譯通過。c 因為支援物件導向程式設計,...

C 的執行期多型和編譯期多型

今日的c 不再是個單純的 帶類的c 語言,它已經發展成為乙個多種次語言所組成的語言集合,其中泛型程式設計與基於它的stl是c 發展中最為出彩的那部分。在物件導向c 程式設計中,多型是oo三大特性之一,這種多型稱為執行期多型,也稱為動態多型 在泛型程式設計中,多型基於template 模板 的具現化與...

ICE常見編譯和執行 異常 錯誤

在編譯和 ice應用相關的檔案中,經常因為 ice相關的檔案包含關係而導致編譯無法通過,此時的錯誤一般提示和 handle.h 相關。然而想要解決這樣的錯誤,一般只需要把在無法編譯成 o檔案的 cpp 檔案中和 ice檔案相關的標頭檔案放在該 cpp 檔案的起始行即可。也就是說,根據提示,把 cpp...