【问题标题】:boost::ptr_vector and cloning objectsboost::ptr_vector 和克隆对象
【发布时间】:2011-12-29 03:26:27
【问题描述】:

我正在尝试将 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 指针向量,所以我制作了 boost::ptr_vector 的 std::vector。但我认为 ptr_vector 复制构造函数执行对象的深层复制,因此错误?在下面的代码中,如果我取消注释任何行,我会得到编译错误 C2259: 'Engine::IPlot' : cannot instantiate abstract class C:\boost_1_48_0\boost\ptr_container\clone_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));
        }
    }
}

【问题讨论】:

  • -1 没有编译器错误消息,令人困惑的问题。您需要克隆支持吗?
  • 编译错误 C2259: 'Engine::IPlot' : 无法实例化抽象类 C:\boost_1_48_0\boost\ptr_container\clone_allocator.hpp 34. 它在我的帖子中。
  • 我不想要克隆支持。我想要一个指针向量,该向量在销毁时会自动删除指针。我正在尝试使用 boost ptr_vector ,它用我不熟悉的克隆支持来困扰我,因此这个问题。我已经想通了,ptr_vector 复制构造函数需要克隆,因为我有一个用于二维数组的 ptr_vector 向量。
  • 使用向量的 ptr_vector 或 ptr_vectors 的 ptr_vector 。使用 ptr_map。对一维向量使用手动索引。

标签: c++ boost


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 2017-02-11
    • 2011-07-10
    • 1970-01-01
    相关资源
    最近更新 更多