2010-10-24 104 views
2

通常,如果我的#include鏈變得循環,我通過用一個前向聲明替換一個#includes來解決它,然後將所有依賴此類型的函數實現移動到cpp文件中,其中我將#include頭。C++如何處理循環依賴?

但是 - 在某些情況下,將函數實現放入cpp文件很不好 - 特別是在處理模板或內聯函數時。

因此 - 是否有其他方法來處理循環#include鏈而不是使用前向聲明?

謝謝!

+0

你能給我們一個例子嗎?我很難完全理解你的意思 – Earlz 2010-10-24 01:59:03

+0

你可以轉發聲明模板就好了。 – 2010-10-24 02:13:48

回答

7

您應該限制這種循環依賴關係,因爲它們使代碼難以理解並難以使用。

也就是說,有時候這樣的依賴是必要的。在這些情況下,您可以在一個頭文件中聲明所有實體,然後在之後,所有聲明都爲任何函數模板和內聯函數提供了定義。例如:

#ifndef MY_AWESOME_INCLUDE_GUARD 
#define MY_AWESOME_INCLUDE_GUARD 

template <typename> struct B; 

template <typename T> 
struct A 
{ 
    template <typename U> 
    void f(B<U>); 
}; 

template <typename T> 
struct B 
{ 
    template <typename U> 
    void f(A<U>); 
}; 

template <typename T> 
template <typename U> 
void A<T>::f(B<U>) { } 

template <typename T> 
template <typename U> 
void B<T>::f(A<U>) { } 

#endif