簡體   English   中英

如何在C ++中適當地包含第三方開源?

[英]How to include 3rd party open source properly in c++ ?

我使用了Boost等多個3rd party庫,我的項目中有一個類,我們稱它為“ MyClass”

“ MyClass”的所有公共函數僅使用標准類型(int,char,string),但是私有函數使用boost的智能指針以及其他庫的其他算法。

因此,在我將類的聲明(及其功能)寫入H文件之前,我要編寫幾個包含文件。

為了使項目編譯,我在項目屬性中添加了一些其他包含庫。 而且一切正常。

問題是,當我想從另一個名為USERPROJECT的項目中使用此類(該類為extern)時,我需要在USERPROJECT項目中包含MyClass.h文件,然后由於MyClass.h包含boost等內容,因此沒有任何編譯內容。沒有在USERPROJECT中配置的文件(我沒有在此處配置其他包含庫,我也不想這樣做,因為他不需要知道它們,它們在MyClass類的私有函數中)。

我該如何解決?

  1. 我應該將MyClass分為2類,一種用於接口,另一種用於實現?
  2. 我應該從H和MyClass中刪除所有包含,並使用正向聲明嗎? (我嘗試過但未能編譯)
  3. 有更好的解決方案嗎

提前致謝

您可以使用pimpl習慣用法來創建編譯器防火牆:

// header file
class C
{
public:
    ...
private:
    struct Impl;
    boost::scoped_ptr<Impl> m;
};

// cpp file
struct C::Impl
{
    // data member that were in C previously go here //
};

這樣,使用頭文件的代碼將看不到類的內容。 這個習語在這里詳細解釋。 但是,如果使用需要鏈接的boost庫,仍然會出現鏈接錯誤。如果僅使用boost的僅標頭部分,則應該沒有問題。

理想的情況是每個項目都可以訪問每個外部組件。 (並且全部使用兼容選項進行編譯,等等)。

如果您能夠朝着這個方向努力,那么您的問題將得到解決。 周圍其他人想要使用boost卻遇到同樣障礙的問題。

如果無法做到這一點,您可能仍然可以使用pimpl解決方案,但這會增加復雜性,維護開銷並在一定程度上降低可讀性。 並且,根據您在boost中使用的內容,可能僅解決問題的編譯部分,因為鏈接可能需要一些額外的lib。 (除非您的東西是獨立的,例如DLL)

對於后一種情況,如果鏈接發生在客戶端站點,則必須走私lib,但是要完全發揮作用並避免混亂是相同的工作量。 因此,在采取行動之前,請先進行一些研究。

暫無
暫無

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

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