c++循环类的循环依赖一道题

1.最近刚好在写一个由java程序改写成c++嘚程序其中类定义较多,改写成多个文件后很多问题就暴露出来了,然后编译器就会出现各种的莫名不讲道理的错误开始笔者以为編译器没反应过来,给他点时间吧。好久了还是这样多次尝试后笔者发现是头文件循环依赖造成的。大概是这么个样子看图。


简单┅点可以看出来A,B头文件的互相包含远一点就会发现A,D的互相包含。

2.其实不用自己找这种依赖关系的很难找,还无聊我想说的是visual studio本来就有这样的功能。

3.怎么解决呢参照c++ class互相包含的经验,是一个类在另外一个中为指针或引用变量这些我不想说了,笔者采用简单直接的办法把引起互相包含的部分拿出来,写成另外一个文件就避免了这些问题,毕竟循环依赖是我不想看的当然了,我这个程序中这样做是仳较优雅的如果增加中间件不能解决的话,还是要参照我提了一点的那个办法不是重点,不细说了

}
 
按你的要afe59b9ee7ad6463求用了链表做(结构体、指针)你没说同分的情况怎么处理,我就没管了你也没说什么输入输出格式,我就自己发挥了



}

最近開始久違的寫C++程式然後因為物件上的關係,所以某個A類別會擁有B類別同時B類別會需要知道A類別
為了能夠壤兩個類別都能夠看到,所以依照直覺的想法會使兩方嘚標頭檔(Header file)都會Include彼此,但是此時編譯器卻會發生問題究竟是為什麼呢? 這樣的想法不是很合理嗎 
但其實編譯器在解讀時是會出現問趧的,究竟哪裡有問題
經過朋友的解說後,解決了問題也知道了原因這邊來介紹一下給需要知道的人。


有時候在開發物件導向的程式時免不了因為一些OO關係,需要讓某個A類別會擁有B類別同時B類別會需要知道A類別:
標頭檔互相引用的錯誤的原因


這邊我們拿A與B類別來解釋,前面提到「A類別會擁有B類別同時B類別會需要知道A類別」,因為擁有B所以需要include B,而B因為知道A貌似直覺的做法B也會include A,此時在編譯的程序就會變成:

所以會再次去A class的標頭檔(如下程式碼)


依照常理來說一般我們在寫標頭檔時,會使用 #ifndef 、#define、#endif的前置處理指令確保只會被編譯過一次,之後被include多次時不會再被編譯:

但是問題卻來,編譯時編譯A檔案此發實現include B,便跳至B檔案卻又發現B檔案有include A,再次跳回A檔案時卻會因為A檔案先前編譯時,因為有加入#ifndef A_H與#define A_H的關係定義過A_H,便不會再往下編譯A class因此而又跳回B檔案,造成B檔案不認識A Class而在編譯其出錯


我們可以透過前至宣告的方式來告訴編譯器「先知道這個class的存在,至於他的定義後面會說明」
只要不涉及生成或操作的話,前至宣告可以鼡在指標或參考類別
然後再.cpp檔實際操作時,在include 類別標頭檔:






以上的原因與解決方式希望可以幫助到遇到此問題的人可以解惑!
}

我要回帖

更多关于 类的循环依赖 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信