我有一组所有来自共同基础的类。我需要一个集合(可能是list
),它将保存各种类型的派生类的实例。类操作将在集合中的实例上调用虚方法。当然,我不能使用list<Base>
,因为按值保存基类将对派生类进行切片。
显而易见的解决方案是使用list<Base*>
并将其包装在具有复制构造函数,析构函数等的类中。基类将具有虚拟duplicate
函数,该函数在每个派生类中重载以返回指向该派生类的复制构造的新实例的指针。析构函数必须遍历列表并delete
每个项目。
如果有一种Boost方法可以做到这一点,那很好。我已经在使用Boost了。在我看来,使用Boost的共享指针将是最好的方法。管理共享引用计数会有开销,但这比指针案例中所需的分配/复制要便宜。但是,这意味着集合的副本将导致相同的实例,更改一个副本将改变另一个副本。
我还不完全知道这段代码将如何实际使用。所以我不确定共享副本语义是否会成为一个问题。我不认为副本会很常见,只需要妥善处理。
还有其他办法吗?
答案 0 :(得分:10)
向Boost.PointerContainer问好。默认情况下,这些在复制容器时提供深层复制语义(但是,这是可自定义的)。请注意,您需要在适当的命名空间中为抽象基类实现一个免费的new_clone
方法。
此外,作为旁注,请使用std::vector
作为您的首选容器。
另一方面注意,不要包裹container<Base*>
,而是将Base*
包裹起来,你猜对了,一个智能指针。如果您不想共享所有权,C ++ 11会提供unique_ptr
。 unique_ptr
只允许移动它,你无法复制它。