gpt4 book ai didi

c++ - 库设计 : Hiding dependencies

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:13 27 4
gpt4 key购买 nike

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

如何处理在第 3 方库中定义的类定义中的私有(private)成员?

例如。 .

标题:

#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);
}

有问题的部分是 header 中的 #include "ThirdPartyLib.h",因为那时我的图书馆的用户需要的不仅仅是我的图书馆。

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

最佳答案

“私有(private)实现类”或“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);}

另一种方法是定义一个抽象接口(interface),以及一个工厂来创建具体的实现类。同样,这会以额外的间接访问为代价从 header 中删除所有实现细节:

// 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);
}

关于c++ - 库设计 : Hiding dependencies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20401372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com