2016-04-28 136 views
1

我可能已經知道答案,但我仍然想看看是否有人能想出一個更好的主意。C++打破循環包括

在較大的庫中,我有很多類彼此交叉引用。我通常通過forward聲明這些類來解決這個問題。然而,爲了便於使用,我通常會定義一個參考類型,它可以出現在這樣一個shared_ptr類:

class A : public B { 
public: 
    typedef std::shared_ptr<A> Ref; 
}; 

它允許好得多引用:A::Ref a代替std::shared_ptr<A> a。我現在看到的問題是使用這樣的Ref需要實際包含該頭文件,導致循環包含。我無法在包含前向聲明的文件中定義Ref類型,因爲XCode使用這樣的共享指針顯示vars的完全僞造值。

還有什麼其他的選擇可以做到這兩點:讓Ref在真實類型上定義,但不需要包含包含該類型的頭文件?

回答

1

我不確定你實際上可以解決這個確切的問題。

但是,如果只是爲了讓你的代碼更漂亮,你可以稍微改變一下邏輯。

有一個名稱空間Refs,用於定義您的typedefs。例如:

namespace Refs { typedef std::shared_ptr<::A> A; } 

所以,相反的A::Ref,您使用Refs::A。我同意它的邏輯性稍差,但至少打字時間並不長。現在,您可以在各種頭文件中根據需要定義這種類型定義,並最終向前聲明它們(當然,前提是您還需要前面聲明類)。

其他選項

但實際上,我會爲這個做的,如果我是你,是使用別名(這需要C++ 11)std::shared_ptr

template<class T> using Ref = std::shared_ptr<T>; 

然後你不需要在任何類或名稱空間中聲明任何內容。只需使用Ref<A>,這更靈活,更清晰。

+0

這可能是要走的路。在上面的/封閉的名稱空間中向A中添加一個前向聲明,並將其放入一個標題中。 – Kent

+0

Ref <>模板別名的確是這裏最好的解決方案,並且完全滿足了兩個條件。 –