【问题标题】:c++ push_back, non const copy constructorc++ push_back,非 const 复制构造函数
【发布时间】:2010-10-01 06:17:30
【问题描述】:

我有一个类,我想将其 push_back 放入双端队列。问题是当我向后推时,我需要更改原始对象,因此我需要一个非 const 复制 ctor。现在,如果我实现我的 const 复制 ctor 被调用。如果我删除了 const ctor,我会收到关于没有可用 ctors 的编译错误。我如何以一种在我传入时可以修改原始结构的方式来实现它?我需要修改它,因为该类在超出范围时会破坏对象,并且我想告诉它在周围有另一个实例时不要这样做。因为我的平台不支持,所以我不能使用 boost。

【问题讨论】:

    标签: c++ copy-constructor


    【解决方案1】:

    根据您要执行的操作(更多详细信息会更好),您可以在调用 push_back 之前/之后修改对象,或者编写一个简单的包装类,该类接受指向您的类的指针并且可以插入变成deque。然后,该对象可以在构造/破坏/等方面对您的类执行适当的操作。

    【讨论】:

    • 这不是真的,auto_ptr 使用非常量复制 ctor 来实现(较差的)可移动语义。
    • 你确实是对的。当我回答它时,我责怪 Google + 缺乏编译器/标准。诅咒你在网上的虚假信息!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • greg,我的意思是 c++1x(不会在 2010 年之前发布)。但我接受你的编辑,因为有些人称它为 c++0x,即使一小群人(虽然,一个正在成长的人)称它为 c++1x :)
      • 在其他圈子里,认为标准将是 C++0b 或 C++0c! :)
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多