繁体   English   中英

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

[英]c++ push_back, non const copy constructor

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

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

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

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

如果你没有做什么狡猾的资源(见其他意见),然后让你想改变可变将允许你改变它在一个const函数的成员变量。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM