我在跨平台的C工作++实例的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 ::矢量< ExampleBase>现在,由于标准::矢量需要类是非纯虚(因为它内部分配/复制等)。我不希望我的代码的用户意外地创建ExampleBase的实例,因为这是错误的。我也想避开物体切割或任何其他黑洞的任何可能性。
std::auto_ptr
将会完成这项工作,但之后我必须处理初始化它们,寻找一个“空闲槽”,没有迭代器等等。看起来有点疯狂,发明了。boost::ptr_vector
看起来前途无量,但它在Linux上构建时的行为有点古怪,因为它需要ExampleBase是非纯虚 - 我不明白为什么...所以boost::ptr_vector
出来了。
这似乎是一个简单的,可能真的很常见的情况。那么做到这一点的最好方法是什么?我愿意接受任何其他标准或推动方式:以“最佳”为准。
请提供您为'ptr_vector'获得的错误消息。它绝对不应该要求基类是非抽象的 - 别的是不对的。 – 2009-09-26 06:02:01
谢谢,很好的答案!经由类型ABC *(抽象基类)的一个指针 – maxpenguin 2009-09-26 06:05:06
删除对象简单地,如果ABC不包括虚拟析构函数不起作用。你得到的编译错误实际上是保护你免受未定义的行为。 – sellibitze 2009-09-26 07:03:26