c++中類的相互呼叫問題
相信大家已經在其他地方看過類的相互呼叫問題了,本篇要說的是,三個類,情況是這樣的,state類呼叫parse類,factory呼叫parse類和state類,而parse類使用了state和factory型別,此時出現了編譯不通的問題,
1.首先是state.h
class parser;
class state
virtual ~state() {}
virtual int parse(string& str)
protected:
parser* m_parse;
}; 「`
2.factory.h
class parser;
class factory
; 3 parse.h
class parser
; 這是正確的操作方式,如果factory.h裡面引用了parse.h,那麼錯誤會提示是parse.h裡面的factory無法辨識型別,錯誤提示在parse.h,但parse.h不需要修改,這個情況需要的是在factory裡面去掉parse.h標頭檔案,然後宣告class parse,
這裡重要的總結:1 網上有多個方式,包括互相宣告類,不互相使用標頭檔案,標頭檔案放到.cpp去匯入,但現在普遍做法是單向引用,然後在被引入者宣告這個類,如例子裡面state.h被parse.h匯入進去,但state要使用parse類,就要在自己宣告class parse,所以標頭檔案只能單向引用,只會編譯一次,不能重複編譯,或者可以認為在編譯state.h時還沒有編譯parse.h所以不認識parse類是個什麼東西,(這個說法有人稱為超前引用),(factory匯入parse.h報錯,實際是factory.h先編譯,此時編譯器會逐行執行,首先看到parse.h,此時factory.h還沒有factory類,但是parse.h裡面呼叫了factory類,所以這個時候報錯的地方並不是factory.h而是parse.h,說factory型別沒有定義,這是個人看法)
2,類在宣告之後就可以使用了,但是只能使用引用或者指標,如state宣告了parse類,但在.h裡面只能使用parse類的指標或者引用,不能呼叫內部函式,如果要用函式,需要在state.cpp裡面匯入parse.h.尤其是有析構函式的時候,要注意在.cpp裡面呼叫析構函式
3 ,盡可能的在.cpp裡面匯入標頭檔案使用,這是來自很多文章的說法,
4,關於互相呼叫導致的錯誤,
在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如:定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別
class a
class b
請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子:
class a
class b
在這種情況下,想想能夠有a.b.a.b.a.b.a.b.a.b…………,很有點子子孫孫無窮盡之狀,那麼我的機器也無法承受。最主要的還是這種關係很難存在,也很難管理。這種定義方式類同程式中的死迴圈。所以,一般來說,兩者的定義,至少有一方是使用指標,或兩者都使用指標,但是決不能兩者都定義實體物件。
這個在直接使用物件的時候,的確可能會造成不斷的產生物件,這一點實際是否會產生,想不通,這一點從別的地方抄過來的,這個主要是說.h裡面盡可能的只用指標或者引用做宣告,而不要使用實際物件,否則會產生不斷的死迴圈,這一點,個人不是很通透,
今天寫到這裡,個人技術實在不好,以後要好好學習了
C與C 的相互呼叫問題
extern c 的雙重含義 extern 是c c 語言中表明函式和全域性變數作用範圍 可見性 的關鍵字,該關鍵字告訴編譯器,其宣告的函式和變數可以在本模組或其它模組中使用。記住下列語句 1 extern int a 2 c與c 的相互呼叫 作為一種物件導向的語言,c 支援函式過載,而過程式語言c...
GO 和C 的相互呼叫 1
愛上了golang,c c 又不想放棄。好在go 語言提供了和c語言相互呼叫的機制 cgo 包括下面幾個問題 本文先討論前面兩個問題。go 和c 相互呼叫是乙個十分有意義的事情,go 語言在編寫網路程式,雲服務等程式時,效率要比c c 高許多倍。使用go 寫乙個web server 只要幾行而已。而...
C和C 相互呼叫
c和c 相互呼叫 2011 11 01 18 42 29 分類 c c 在專案中融合c和c 有時是不可避免的,在呼叫對方的功能函式的時候,或許會出現這樣那樣的問題。近來在主程式是c語言,而呼叫c 功能函式的時候,c 的 h標頭檔案都能找到,功能函式也都定義了,最重要的是,單獨編譯c 的時候完全沒有問...