Boost::ptr_vector和克隆对象

boost::ptr_vector and cloning objects

本文关键字:对象 vector ptr Boost      更新时间:2023-10-16

我试图使用boost::ptr_vector,具有抽象基类,但我得到编译错误。

/////////////////////////////////////////////////////////////////////////
// Clonable concept 
/////////////////////////////////////////////////////////////////////////
template< class T >
inline T* new_clone( const T& r )
{
    //
    // @remark: if you get a compile-error here,
    //          it is most likely because you did not
    //          define new_clone( const T& ) in the namespace
    //          of T.
    //
    T* res = new T( r );
    BOOST_ASSERT( typeid(r) == typeid(*res) &&
                  "Default new_clone() sliced object!" );
    return res;
}

我不明白为什么我需要提供一个克隆函数。这就是我想要一个指针向量的全部原因。它应该复制指针,而不需要克隆函数。


我想我找到问题了。我实际上想要一个2d的指针向量,所以我创建了一个std::vector的boost::ptr_vector。但我认为它的ptr_vector复制构造函数执行对象的深度复制,因此错误?在以下代码中,如果我取消注释任何行,我得到编译错误C2259: 'Engine::IPlot':无法实例化抽象类C:boost_1_48_0boostptr_containerclone_allocator.hpp 34。还有什么方法可以得到二维数组呢?
class World : public IWorld
{
public:
    World(const Engine::PairInt& plot_size);
    virtual ~World();
    virtual const Engine::PairInt& GetPlotSize() const;
    virtual Engine::IPlot *GetPlot(Engine::PairInt coord);
    virtual const Engine::IPlot *GetPlot(Engine::PairInt coord) const;
protected:
    typedef std::vector< boost::ptr_vector< IPlot > > PlotMap;
    PlotMap plot_map;
    const Engine::PairInt plot_size;
};
World::World(const PairInt& plot_size_in)
: plot_size(plot_size)
//, plot_map(GetPlotSize().y)
{
    PairInt plot_size = GetPlotSize();
    //plot_map.reserve(plot_size.y);
    for (int y = 0; y < plot_size.y; y++)
    {
        //plot_map.push_back(boost::ptr_vector< IPlot >());
        for (int x = 0; x < plot_size.x; x++)
        {
            plot_map[y].reserve(plot_size.x);
            plot_map[y].push_back(IPlot::Create(Vector2(PairInt(x, y).ToVector2()), true));
        }
    }
}

我的水晶球告诉我你使用的是resize。不要用它,用push_back之类的