我有一个对象向量。每个对象都有指向不可复制对象(boost::signal)的 boost::shared_ptr。该对象的默认构造函数创建 boost::signal 对象。
struct FuncRef
{
typedef boost::signal0<void, > Func;
boost::shared_ptr <Func> function;
FuncRef():
function(new Func)
{
}
};
为了使我的向量包含X个单独的对象,我做了以下操作: -
vec.resize(X);
这个并没有达到我的预期,因为它使用默认构造函数创建一个对象,然后使用复制构造函数来创建副本。最终我会得到X个对象,但是它们都指向同一个
boost::signal0
对象。是否有更简单的方法来正确构建我的向量,而不只是在
for
循环中使用push_back
?
boost::noncopyable
,以便在编译时检测此类错误。 - Björn Pollexwhile (vec.size() < X) vec.emplace_back();
。 这表明你不想进行任何复制,但可惜的是没有emplace_several_times
。更好的方法是,它应该允许你使用unique_ptr
而不是shared_ptr
,这样你的元素是可移动但不可复制的。这使你能够实际禁止你不想要的复制。但是,在C++0x下,boost::signal
本身是否可移动我不知道。 - Steve Jessop