c ++ push_back,非const复制构造函数

时间:2009-01-13 22:20:36

标签: c++ copy-constructor

我有一个课,我想把它推回到一个双端队列。问题是,当我推回时,我需要更改原始对象,因此我需要一个非const复制ctor。现在,如果我实现我的const复制ctor被调用。如果我删除了常量,我得到一个关于没有可用的ctors的编译错误。我如何实现这一点,我可以修改原始结构,当我传入它?我需要修改它bc当类超出范围时类破坏对象,我想告诉它不要在有另一个实例时这样做。我不能使用提升,因为我的平台不支持它。

4 个答案:

答案 0 :(得分:8)

您的问题是标准容器的基本要求是对象是可复制构造的。这不仅意味着它们具有复制构造函数,而且这也意味着如果复制对象,则副本和原始文件是相同的。

然而,您的对象类似于移动构造函数语义。也就是说,在移动之后,新对象拥有资源,旧对象为空。从C ++ 03开始,deque不支持这一点。顺便说一下,禁止将auto_ptr放入容器的原因相同。

下一个名为c ++ 0x的C ++版本将通过引入特殊的移动构造函数来支持这些移动语义。在此之前,当您想要将其放入标准容器时,必须使用共享所有权的对象。这意味着如果您复制对象,并且原始文件超出范围,则在所有副本超出范围之前,不会释放拥有的资源。例如,考虑使用boost :: shared_ptr,或者将它包装到您的类中,如果您不想编写自己的类来管理它。

答案 1 :(得分:2)

如果你没有对资源做任何狡猾的事情(参见其他评论),那么制作你想要改变的成员变量 mutable 将允许你在const函数中改变它。

答案 2 :(得分:1)

根据你要做的事情(更多细节会很好),你可以在调用push_back之前/之后修改对象,或者编写一个简单的包装类来获取指向你的类的指针被插入deque。然后,此对象可以在构造/销毁/等上为您的类做适当的事情。

答案 3 :(得分:1)

你无法做你想做的事。你必须使用普通或智能指针(但不是auto_ptr<>)。你为什么不能使用Boost智能指针?它们非常轻量级,应该适用于所有合理的标准C ++编译器。您不必全部使用Boost。