我有一个Qt项目,那里有一个Object,它将被复制很多时间。因此,我想添加移动语义。
#ifndef OBJECTTOCOPY_H
#define OBJECTTOCOPY_H
#include <QColor>
#include <QString>
#include <QDataStream>
namespace level_1 {
namespace level_2 {
class ObjectToCopy {
public:
explicit ObjectToCopy(const QString& _name = "", const QColor& colorBody = QColor() );
// MOVE
ObjectToCopy(ObjectToCopy && other);
static quint32 _valueInt32;
static quint16 _valueInt16;
QString _name;
QColor _colorBody;
private:
};
}
}
#endif // OBJECTTOCOPY_H
既然成员变量没有指针,我该如何窃取它们的指针?
ObjectToCopy::ObjectToCopy (ObjectToCopy&& other)
: _valueInt32( other._valueInt32 )
, _valueInt16( other._valueInt16 )
, _name( other._name )
, _colorBody( other._colorBody )
{
other._valueInt32 = 0;
other._valueInt16 = 0;
other.name.clear();
other._colorBody = QColor();
}
- 这对非指针有意义吗
- 可以重置QString的类似string.clear((;为垃圾收集器标记
- 如何重置QColor对象
当然可以添加移动语义,但在您的情况下根本不需要这样做。通过复制来移动五分之一、五分之一32、五分之十六。QColor是围绕并集的包装器,没有移动构造函数(不需要(,也将通过复制来移动。QString是QT中的引用计数类型。在最新版本的库中,它有move构造函数,但速度上的差异将是最小的(交换指针和递增引用计数器之间的差异(。
您正在寻找std::move:
ObjectToCopy::ObjectToCopy (ObjectToCopy&& other)
: _valueInt32( other._valueInt32 )
, _valueInt16( other._valueInt16 )
, _name( std::move(other._name) )
, _colorBody( std::move(other._colorBody) )
{
other._valueInt32 = 0; //probably not necessary
other._valueInt16 = 0; //probably not necessary
//other.name.clear(); //not necessary
//other._colorBody = nullptr; //not necessary
}
移动非指针是有意义的。你正在制作这样一个物体。移动整数没有帮助,但也没有坏处,所以为了一致性,你也可以这样做。移动没有移动构造函数的东西也可以:如果没有可用的移动构造函数,则使用复制构造函数(移动并不总是更好,但也不会更糟(。
上面的实现说">通过复制
int
并移动name
和_colorBody
来移动"。确保您没有从
move
d中读取变量。可以,但没有必要。
other
应该是一个临时的,无论如何都会被摧毁。(C++在你的意义上没有垃圾收集器(同样,一旦对象是
move
d,它就倾向于处于clear
ed状态,就像QString
一样,但情况并非总是如此。你真的不能。您可以指定一个默认构造的颜色,如
other._colorBody = QColor();
,但这只是意味着它将颜色设置为黑色。QColor
不能为空,它总是有一些颜色。
另请阅读移动语义是什么?