微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

移动包含值的对象

如何解决移动包含值的对象

我有一堂这样的课:

class Bla {
private:
    size_t length;
    ComplexClass expensiveData; // Very expensive,and Bla manages everything about someStuff,including its creation and deletion
};

现在假设我想做这样的事情:

Bla a = ...;
Bla b = ...;

a = b;

现在我认为会发生的是,当我将 a 赋值给 b 时,将调用复制赋值运算符。

问题是,如果我要深度复制 ab内容,代价会非常大。最好总是只做一个Bla的浅拷贝。然而,问题在于 expensiveData一个常规值,而不是一个指针,这意味着如果我尝试将 expensiveData 重新分配给一个新对象,它只会复制它。

此外,expensiveData 是由我使用的库之一提供的,我无法更改它的工作方式。

我是否应该:

  1. 删除复制赋值和复制构造函数运算符,因为我从不想做任何深度复制,但随后就失去了赋值的能力。
  2. expensiveData 改成指针,然后在复制构造函数中重新分配指针。
  3. 使用其他方法,例如 std::movestd::swap

解决方法

存储指向 ComplexClass 的指针是可行的,但使用 raw 指针是不明智的。使用 std::shared_ptr<ComplexClass>

或者,您可以删除复制构造函数和赋值,然后在需要赋值时将 Bla 存储在 shared_ptr 中。

您可以:

  • 将它们设为私有,并添加一个成员函数,该函数的名字很吓人,可以在您需要时执行它们。
  • 只删除复制赋值,并使复制构造函数explicit。然后 a = b; 不会编译,但 a = Bla(b); 仍然会。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。