C 類和其友元類的標頭檔案該怎樣相互包含

時間 2021-05-29 22:57:46

1樓:

宣告的時候不用包含所宣告類的標頭檔案,所以友元宣告直接宣告就好了,否則會出現互相包含,造成很大的麻煩。

#include只是把多個檔案複製在一起,所以只需要乙個宣告,他們最終還是會遇到的。

2樓:李白

看到這個問題,說一下我的理解. 宣告友元的那個類我們稱為A,由於它需要搜尋另乙個類B的函式名形參等等資訊,因此單純的宣告class是不行的,需要寫上#include. 而另乙個實現友元函式的類B,由於它不需要知道類A的其他資訊,只需要用到引用或者指標,所以簡單的 class A宣告一下就可以了.

注意,不能多寫#include,多寫就出錯了!因為迴圈包含的問題,會導致編譯器執行到友元類成員宣告的時候,還沒有執行到友元宣告的那一步,所以會報unknown的錯誤.

3樓:張砸鍋

早年我在開發時也遇到過與題主所述類似的問題,在仔細思考了以後解決了,關鍵就在於盡量消除迴圈引用

1、如果是設計不合理,不該引用的出現了引用,那麼就應該取消掉這個引用。很多時候,你可能會為了編碼時呼叫方便,很隨意的增加了類之間的引用關係,那麼改掉這個毛病,必須是想明白了每個類的職責以及類和類之間的關係後再決定誰應該引用誰。

2、如果兩者之間必須互相引用,那麼考慮是不是可以抽象出第三個類,使得兩者不直接引用,而都通過第三者發生作用。

3、如果兩者之間必須互相引用,而且無法抽象出第三者過渡,那麼一定會有一方對另一方的引用僅是型別的引用,而不需該類中的成員,那麼向前宣告(forward declaration)對方即可(輪子哥的答案)。注意,這裡說的是在標頭檔案中。在實現檔案中,通常都會引用到該類的成員。

4、如果你的兩個類的方法實現都希望是內聯的,而且又互相引用對方,那說明這兩個類是關係太密切了,而能用內聯又說明方法都很簡單,那乾脆兩個類都寫在同乙個標頭檔案內吧。在整個檔案的開始,加上對兩個類的向前宣告。

C 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯?

孫嘉成 把模板的宣告放在.h檔案中,實現放在.cpp檔案中,在main.cpp檔案中 include XX.cpp 同樣可以正常使用模板函式,但是這並不能實現您說的隱藏實現,只是表面上將宣告和實現分離了,沒什麼實際用處,只是看著好看一些,不建議使用。 zaoru 1.包含模型 常規寫法將實現寫在標頭...

C 中的友元函式既然破壞了類的封裝性,那它存在的意義是什麼?

C十十20年 破不破壞有什麼關係呢,如果你想訪問私有成員的話。class Aa struct B void main 魯哈花 friend能夠破壞封裝性,但不是為了破壞封裝性而存在 類似goto,goto能夠讓你的程式更費解,但這並非是保留goto的目的。 右手特別巨 友元不是為了破壞類的封裝性,恰...

C 中的命名空間和類有什麼區別?

幽幽 命名空間name space可以被再次開啟,並新增新成員。但是類class不允許。舉個簡單的例子 命名空間這麼使用是正確的 namespace A Re open and add new member is legal namespace A但是,類這麼使用是不正確的 classA Re op...