我在跨平台 C++ 中工作,并且有一些这样定义的类:(对于这个例子进行了高度简化)
class ExampleBase
{
public:
ExampleBase( int blah ) : blah_test(blah) { }
virtual void DoSomething( ) = 0;
private:
int blah_test;
};
class ExampleImplementer : public ExampleBase
{
public:
ExampleImplementer( ) : ExampleBase( 5 ) { }
virtual void DoSomething( ) { /* unique implementation here */ }
};
最初我只有一个类,我将一堆实例存储在 std::vector 中,并通过 const 引用传递。但是现在我需要一个基类(我想保持纯虚拟)和一些多态实现类。
收集任何实现实例的最佳方法是什么,并且仍然具有无泄漏的简单内存管理,例如分配堆栈 std::vector?
显然我现在不能拥有 std::vector< ExampleBase >,因为 std::vector 要求该类是非纯虚拟的(因为它执行内部分配/复制等)。我不希望我的代码的用户意外地创建 ExampleBase 的实例,因为那是错误的。我还想避开对象切片或任何其他讨厌的任何可能性。
一个数组
std::auto_ptr
可以完成这项工作,但是我必须处理所有初始化,寻找“空闲槽”,没有迭代器等。重新发明所有这些轮子似乎有点疯狂。boost::ptr_vector
看起来很有希望,但是它的行为有点奇怪,因为在 Linux 上构建时,它需要 ExampleBase 是非纯虚拟的 - 我不明白为什么......所以boost::ptr_vector
出来了。
这似乎很简单,而且可能很常见。那么最好的方法是什么?我对任何其他标准或增强方式持开放态度:以“最好”为准。