所以我一直在考虑pimpl和堆栈分配。我一直在编写一个图书馆,并决定使用Pimpl来隐藏课堂的私人成员。这意味着我将有一个像这样宣称的阶级

class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};
.

它非常直接。但是,在构造函数中,你这样做

Foo::Foo() : handle(new Handle()) {}
. 因此,当使用我的图书馆的某人在堆栈上创建一个foo时,他们基本上是堆分配的。这是使用PIMPL时必须与之生活的权衡吗?我想在构造函数旁边发出警告发布文件:“警告:这导致堆分配”或SomeSuch。

我的另一个思想是拥有所有课程,它暴露于实现为纯虚拟接口以及返回智能指针的整个静态工厂方法。这也意味着堆分配,但没有伎俩。

任何思想或建议?我使用我的图书馆过度考虑程序员吗?

其他提示

因此,当使用我的图书馆的某人在堆栈上创建一个foo时,他们基本上是堆分配的。这是使用PIMPL时必须与之生活的权衡吗?

YEP。

我想在构造函数旁边发出警告发布文档:“警告:这导致堆分配”或SomeSuch。

我认为超强评论:)如果您的课程是如此表现关键,也许您应该避免Pimpl成语。如果您代表一个数字,这可能会有关和值得注意。如果您隐藏了数据库连接的实现,不值得注释:)

我的另一个思想是拥有所有课程,它暴露于实现为纯虚拟接口以及返回智能指针的整个静态工厂方法。这也意味着堆分配,但没有伎俩。

是的,对用户来说,这有点明显,但再次可能有关自己的价值。

任何思想或建议?我使用我的图书馆过度考虑程序员吗?

有一个权衡,但如果您的课程足够复杂,可以从PIMPL成语中获得足够的,您可能会假设堆分配可以。如果我在使用你的图书馆,它可能与我无关。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top