gpt4 book ai didi

c++ - 在 C++ 中处理正文习语

转载 作者:太空狗 更新时间:2023-10-29 21:47:43 24 4
gpt4 key购买 nike

我的库中有一个类,我想将其公开给用户。我不想公开整个类,因为我以后可能想进行二进制不兼容的更改。我对以下哪种方法最好感到困惑。

案例一:

struct Impl1;
struct Handle1
{
// The definition will not be inline and will be defined in a C file
// Showing here for simplicity
void interface()
{
static_cast<Impl1*>(this)->interface();
}
}

struct Impl1 : public Handle1
{
void interface(){ /* Do ***actual*** work */ }
private:
int _data; // And other private data
};

案例二:

struct Impl2
struct Handle2
{
// Constructor/destructor to manage impl
void interface() // Will not be inline as above.
{
_impl->interface();
}
private:
Impl2* _impl;
}

struct Impl2
{
void interface(){ /* Do ***actual*** work */ }
private:
int _data; // And other private data
};

Handle 类仅用于公开功能。它们将仅在图书​​馆内部创建和管理。继承只是为了抽象实现细节。不会有多个/不同的 impl 类。在性能方面,我认为两者将是相同的。是吗?我正在考虑采用案例 1 方法。有什么需要注意的问题吗?

最佳答案

您的第二种方法看起来非常像编译防火墙习惯用法(有时称为 PIMPL 习惯用法)。

唯一不同的是,在编译防火墙惯用语中,通常(但不总是)将实现类定义为成员。不要忘记构造函数(分配 Impl)和析构函数(释放它)。以及复制构造函数和赋值运算符。

第一种方法也可行,但它需要工厂函数来创建对象。当我使用它时,我只是将Handle 中的所有函数纯虚拟化,让客户端代码直接调用它们。

在这种情况下,由于客户端代码实际上有指向您的对象的指针(在编译防火墙习惯用法中,唯一的指针在 Handle 类本身中),客户端将不得不担心内存管理;如果没有循环是可能的,这是 shared_ptr 很有意义的一种情况。 (工厂函数可以返回一个shared_ptr,例如,客户端代码可能永远看不到原始指针。)

关于c++ - 在 C++ 中处理正文习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12638566/

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