C++ 包含二维双精度数组的对象的重载赋值运算符

C++ 包含二维双精度数组的对象的重载赋值运算符,c++,C++,我在为下面的类编写重载赋值运算符时遇到了很大的问题: namespace w3{ class DArray2d{ int rows; int columns; double **array; public: DArray2d(); DArray2d(int, int); DArray2d(const DArray2d &obj); DArray2d&am

我在为下面的类编写重载赋值运算符时遇到了很大的问题:

namespace w3{

    class DArray2d{

        int rows;
        int columns;
        double **array;

    public:

        DArray2d();
        DArray2d(int, int);
        DArray2d(const DArray2d &obj);
        DArray2d& operator=(DArray2d& rhs);
        DArray2d(const DArray2d &&obj);
        DArray2d& operator=(DArray2d&& rhs);
        double check() const;
        ~DArray2d();
    };

}
下面是我尝试的,但我遇到了一个分段错误:11当我尝试复制for循环中的每个元素时:

w3::DArray2d& w3::DArray2d::operator=(w3::DArray2d& rhs){

    // std::cout << "assignment operator" << std::endl;

    if ( this != &rhs )
    {   


        this->rows = rhs.rows;
        this->columns = rhs.columns;

        std::cout << this->rows << std::endl;
        std::cout << this->columns << std::endl;

        for(int a = 0; a < rhs.rows; a++){
            for(int b = 0; b < rhs.columns; b++){
                array[a][b] = rhs.array[a][b];
            }
        }
    }

    return *this;

}
w3::DArray2d&w3::DArray2d::operator=(w3::DArray2d&rhs){
//std::cout columns=rhs.columns;

std::cout行使用
std::vector
作为存储,并让编译器生成赋值。简单明了;-)如果
这个
数组的维度与
rhs
数组的维度不同,您可以复制维度,但不需要重新分配内存。如果您将100x100数组赋值给1x1数组,
这个->数组不会神奇地变为更大的——你的程序会有一个缓冲区溢出。我不能。我希望我能。这是一个任务的一部分,我猜是为了教C++函数的内部工作。所以我被困了:(是的,您可以使用复制构造函数:您的赋值运算符需要删除旧数组并分配一个大小合适的新数组。复制和交换是一种很好的方法。
w3::DArray2d::DArray2d( const DArray2d &obj):rows(obj.rows), columns (obj.columns) {

    // std::cout << "copy constructor" << std::endl;

    if(this != &obj){

        array = new double*[obj.rows];
        for(int i = 0; i < obj.columns; i++){
            array[i] = new double[columns];
        }

        for(int a = 0; a < obj.rows; a++){
            for(int b = 0; b < obj.columns; b++){
                array[a][b] = obj.array[a][b];
            }
        }

    }

}
for (int a = 0; a < rows ; ++a){
    delete [] array[a];
}
delete [] array;