簡體   English   中英

如何在我自己的頭文件中不包含boost頭文件

[英]how to not include boost header file in my own header file

我在上課

在課堂上,我將boost :: graph :: adjacent_list用作私有成員。

但我不希望我的頭文件包含boost頭文件,因為任何其他包含我的頭文件的文件都需要包含boost頭文件。

有沒有一種方法可以避免在我自己的頭文件中包含boost頭文件。

我已經嘗試過向前聲明,但是失敗了。

您不能直接執行此操作,但是您可以通過對類進行pimpl來解決不傳播實現細節(提升)的潛在問題。 從本質上講,這意味着您向前聲明一個指向實現細節的指針,然后僅在源文件中完全實現這些細節。

如果您的頭文件僅是定義文件,並且已在cpp文件中完全實現(即,頭文件對boost::graph::adjacent_list無效,則可以在頭文件中進行操作)

  • 轉發聲明一個bgalWrapper結構。
  • 有一個指向該結構的指針,而不是boost::graph::adjacent_list
  • 在實現頭文件的CPP文件中,聲明新的bgalWrapper結構(僅具有boost::graph::adjacent_list成員)
  • 在類ctor中創建結構的實例(並且-顯然
    • 在dtor中清理)。

現在,每個類都可以對boost項目進行引用,而標題無需了解boost。

這種模式可能有一個名稱(和維基頁面),但是距我認真編程C ++已經有好幾年了。

希望這可以幫助。

更新我所描述的是PIMPL慣用語的部分實現
謝謝馬克B

我沒有測試它,但是您不能將列表定義為指針變量嗎? 然后,前向聲明應該成功。 但是,您必須嵌套名稱空間:

using namespace boost::graph;
class adjacent_list;
class MyClass {
    private adjacent_list<foo, bar> m_list;
}

也許:

namespace boost {
    namespace graph {
        class adjacent_list;
    }
}
class MyClass {
    private adjacent_list<foo, bar> m_list;
}

然后在實現文件中,將其用作指針:

#include <boost/graph/adj_list_serialize.hpp>
MyClass::MyClass() {
    m_list = new adjacency_list<foo, bar>();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM