使用非指针数据移动 ctor 和移动赋值运算符

Move ctor and move assignment operator with non pointer data

提问人:newstudent 提问时间:8/13/2020 最后编辑:newstudent 更新时间:8/16/2020 访问量:111

问:

我是C++编程的新手,在这里是stackoverflow。我希望你能原谅我在这里的第一个问题,这些问题写得不太好。

我正在 BigData 类中添加移动构造函数和移动赋值运算符。 有人可以告诉我它们写得好不好吗? 多谢

这是我在 BigData 类中使用的结构数据。这就是我实现这两种方法的方式。

struct Data {
    //...
Data(Data &&_d)
    {
        data = _d.data;
        _d.data = nullptr;
        size = _d.size;
        _d.size = 0;
    }

    Data& operator=(Data&& _d)
    {
        if (this != &_d)
        {
            delete[] data;
            data = _d.data;
            _d.data = nullptr;
            size = _d.size;
            _d.size = 0;
        }
        return *this;
    }
    
        unsigned char *data = nullptr;
        unsigned int size = 0;
    };

但现在,我不确定我是否做得好。由于 Data 不是指针,因此我无法编写与编写 Data 结构方法时相同的内容。 现在当我做BigData时 bd2= move(bd1); BD1 与数据数组保持联系...我应该以某种方式删除它吗?

class BigData {
public:
    
            BigData(BigData &&_bd)
        {
            m_data = _bd.GetData();
            m_crc = _bd.GetCrc();
            _bd.InvalidateCrc();
        }

    BigData& operator=(BigData &&_bd)
    {
        if (this != &_bd)
        {
            m_data = _bd.GetData();
            m_crc = _bd.GetCrc();
    
        }
        return *this;
    }

private:
    Data m_data;
    unsigned long int m_crc = -1;
};
C++ 构造函数 重载 C++17 赋值运算符

评论

1赞 Jeffrey 8/13/2020
为什么不将所有 BigData 构造函数和赋值运算符保留为默认值?对于这样一个简单的聚合类,假设 Data 被正确实现,它将完美地工作。
0赞 Peter 8/13/2020
请考虑将默认值(编译器提供的内容,除非您重写它)用于复制/移动构造函数和相应的赋值运算符。您可能想要了解如何在构造函数中使用初始值创建器列表,以及如何在移动构造函数和赋值中使用。此外,还可以实现赋值运算符创建副本和交换。std::move()
0赞 newstudent 8/13/2020
@Jeffrey我想了想,这里不需要自己写。但是我被要求为 struct Data 和类 BigData 制作 move ctor 和 move 赋值运算符。
0赞 newstudent 8/13/2020
@Peter谢谢。好吧,我得到了所有实现的代码,然后只给我写了两个。
0赞 Peter 8/13/2020
@newstudent - 可能是这样。但是,如果已经实施的那些可以改进,那么值得考虑这样做。

答: 暂无答案