图书馆设计:隐藏依赖关系

时间:2013-12-05 13:32:08

标签: c++ header static-libraries

我正在尝试构建一个内部使用第三方库的库,但我不想将这个第三方库公开给我的库用户。这样,当构建静态库时,用户只需要我的头和编译的库。

如何处理第三方库中定义的类定义中的私有成员?

例如。 。

头:

#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",因为我的图书馆的用户需要的不仅仅是我的图书馆。

解决这个问题的一种方法可能是转发声明标头中使用的所有第三方类型,然后用引用替换值类型,但我想知道是否还有其他方法或设计我完全忽略了?< / p>

1 个答案:

答案 0 :(得分:4)

“私人实施类”或“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);
}