C ++:在二维数组上实现移动赋值运算符

时间:2015-09-11 04:33:09

标签: c++ arrays pointers multidimensional-array

我有一个用于实现矩阵的类,在这里:

template<typename Comparable>
class Matrix {
    private: 
        std::size_t num_cols_;
        std::size_t num_rows_;
        Comparable **array_;

    public:
        Matrix();
        ~Matrix(); // Destructor
        Matrix(const Matrix<Comparable> & rhs);// Copy constructor
        Matrix(Matrix<Comparable> && rhs); // Move constructor
        Matrix<Comparable> & operator= (const Matrix<Comparable> & rhs);// Copy assignment
        Matrix<Comparable> & operator= (Matrix<Comparable> && rhs); // Move assignment
        template<typename buh> friend std::ostream &operator<< (std::ostream &os, Matrix<buh> &rhs);
        void ReadMatrix();
};

(向量不是这个特定问题的选项。)

array_成员特别拥有矩阵本身,并使用以下代码填充:

array_ = new Comparable*[num_rows_];
    for (int i = 0; i < num_rows_; ++i) {
        array_[i] = new Comparable[num_cols_];
    };

    for(int i = 0;i < num_rows_; ++i) {
        std::cout << "Enter items for row " << i << "." << std::endl;
        for(int j = 0;j < num_cols_; ++j) {
            std::cin >> array_[i][j];
        }
    }

我可以使用值填充数组并访问它们,并且我的复制构造函数和移动赋值运算符是可用的,但移动赋值运算符会抛出一个奇怪的错误。这是定义。

template<typename Comparable>
Matrix<Comparable>& Matrix<Comparable>::operator= (Matrix<Comparable> && rhs) {
    delete[] array_;
    array_ = new Comparable*[rhs.num_rows_];    
    for(int i = 0;i < rhs.num_rows_;++i) {
        std::swap(array_[i],rhs.array_[i]);
        rhs.array_[i] = nullptr;
    }
    rhs.num_cols_ = 0;
    rhs.num_rows_ = 0;
    rhs.array_ = nullptr;
    return *this;
}

采用a = std::move(b);语句。如果b的大小与a不同,则矩阵数据会因移动而变形。如果b的列数多于a,则额外的列将被截断;如果b的行数少于a,则多余的行将保留在a中;如果a有比b更多的列或行,多余的列将显示内存地址,其中根本没有任何内容。这是一个简单的错误吗?我创建数组的方式有问题吗?任何了解造成这种情况的原因都表示赞赏。

1 个答案:

答案 0 :(得分:0)

“移动分配”并不意味着“仔细修改传入的对象以成为某种'空'值”,这意味着“修改传入的对象很好”。

在此处移动分配应该有一个非常简单的实现:只需交换。

template<typename Comparable>
Matrix<Comparable>& Matrix<Comparable>::operator= (Matrix<Comparable> && rhs) {
    using std::swap;
    swap(array_, rhs.array_);
    swap(num_cols_, rhs.num_cols_);
    swap(num_rows_, rhs.num_rows_);
    return *this;
}