我有一个类,我想 push_back 到一个双端队列中。问题是当我向后推时,我需要更改原始对象,因此我需要一个非 const 复制 ctor。现在,如果我实现我的 const 复制 ctor 被调用。如果我删除了 const ctor,我会收到一个关于没有可用 ctors 的编译错误。我如何以一种在我传入时可以修改原始结构的方式来实现它?我需要修改它,因为该类在超出范围时会破坏对象,并且我想告诉它在周围有另一个实例时不要这样做。我不能使用 boost,因为我的平台不支持它。
4 回答
您的问题是标准容器的基本要求是对象是可复制构造的。这不仅意味着它们具有复制构造函数,而且还意味着如果复制对象,则副本和原始对象是相同的。
但是,您的对象类似于移动构造函数语义。也就是说,移动后,新对象拥有资源,而旧对象为空。从 C++03 开始,deque 不支持这一点。也就是说,顺便说一下,禁止将 auto_ptr 放入容器的原因相同。
名为 c++0x 的下一个 C++ 版本将通过引入特殊的移动构造函数来支持这些移动语义。在那之前,当您想将其放入标准容器中时,您必须使用共享所有权的对象。这意味着如果您复制您的对象,并且原始对象超出范围,则在所有副本超出范围之前不会释放拥有的资源。例如,考虑使用 boost::shared_ptr,或者将其包装到您的类中,如果您不想编写自己的类来管理它。
如果您没有对资源做任何狡猾的事情(请参阅其他评论),那么使您想要更改的成员变量可变将允许您在 const 函数中更改它。
根据您要执行的操作(更多详细信息会很好),您可以在调用之前/之后修改对象,也可以push_back
编写一个简单的包装类,该类接受指向您的类的指针并可以插入到deque
. 然后,该对象可以在构造/破坏/等方面对您的类执行适当的操作。
你不能做你想做的事。您必须使用指针,无论是普通的还是智能的(但不是 auto_ptr<>)。为什么不能使用 Boost 智能指针?它们非常轻量级,应该可以在所有合理的标准 C++ 编译器中工作。您不必使用所有的 Boost。