[英]Library design: Hiding dependencies
我正在嘗試構建一個內部使用第三方庫的庫,但我不想將這個第三方庫公開給我的庫用戶。 這樣,當構建靜態庫時,用戶只需要我的頭和編譯庫。
如何處理第三方庫中定義的類定義中的私有成員?
例如 。 。
#include "ThirdPartyLib.h"
class DummyClass
{
TypeFromThirdParty tftp;
public:
bool checkStuff(const float) const;
};
#include "ThirdPartyLib.h"
#include "dummy.h"
bool DummyClass::checkStuff(const float t)
{
return tftp.isOk(t);
}
違規部分是標題中的#include "ThirdPartyLib.h"
,因為我的庫的用戶需要的不僅僅是我的庫。
解決這個問題的一種方法可能是轉發聲明標頭中使用的所有第三方類型,然后用引用替換值類型,但我想知道是否還有其他方法或設計我完全忽略了?
“私人實施類”或“pimpl”習語是一種方法。 這使得第三方庫(和其他實現細節)全部提到標題之外,代價是額外的間接級別:
// header
#include <memory>
class DummyClass {
public:
DummyClass();
~DummyClass();
bool checkStuff(float t);
private:
struct Impl;
std::unique_ptr<Impl> impl;
};
// source
#include "DummyClass.h"
#include "ThirdPartyLib.h"
struct DummyClass::Impl {
TypeFromThirdParty tftp;
};
DummyClass::DummyClass() : impl(new Impl) {}
// This must be defined here, since ~unique_ptr requires Impl to be complete
DummyClass::~DummyClass() {}
bool DummyClass::checkStuff(float t) {return impl->tftp.isOk(t);}
另一種方法是定義一個抽象接口,一個工廠來創建具體的實現類。 同樣,這將從標頭中刪除所有實現細節,代價是額外的間接:
// header
#include <memory>
struct DummyInterface {
virtual ~DummyInterface() {}
virtual bool checkStuff(float t) = 0;
static std::unique_ptr<DummyInterface> create();
};
// source
#include "DummyClass.h"
#include "ThirdPartyLib.h"
struct DummyClass : DummyInterface {
TypeFromThirdParty tftp;
bool checkStuff(float t) {return tftp.isOk(t);}
};
std::unique_ptr<DummyInterface> DummyInterface::create() {
return std::unique_ptr<DummyInterface>(new DummyClass);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.