我有一个用于实现矩阵的类,在这里:
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更多的列或行,多余的列将显示内存地址,其中根本没有任何内容。这是一个简单的错误吗?我创建数组的方式有问题吗?任何了解造成这种情况的原因都表示赞赏。
答案 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;
}