5

我目前正在做以下练习:

一个通用的矩阵类(15 分)

a) 创建一个名为 Matrix 的类,它应该包含 M*N 个 double 类型的存储。就像之前一样,在选择如何存储数据时,了解我们以后将使用数据做什么通常很有用。在矩阵运算中,我们将根据列和/或行访问矩阵的不同元素,因此将 Matrix 的成员排序为数组很有用。此外,我们将需要更改存储在矩阵中的数据的大小,因此它应该是动态分配的。

b) 为矩阵创建构造函数。

创建以下三个构造函数: Matrix() • 默认构造函数,应将矩阵初始化为无效状态。

显式矩阵(无符号整数 N) • 应该构造一个有效的 NxN 矩阵,初始化为单位矩阵。(课程大纲中没有明确的关键字,但应该在这里使用。)

Matrix(unsigned int M, unsigned int N) • 应该构造一个有效的MxN 矩阵,初始化为一个零矩阵。(所有元素都为零。)

~Matrix() • Matrix 的析构函数,应该删除所有动态分配的内存。

到目前为止,我的课程如下:

    class Matrix{
    private:
        int rows;
        int columns;
        double* matrix;
    public:
        Matrix();
        explicit Matrix(int N);
        Matrix(int M, int N);
        ~Matrix();
};

我的其余代码:

    Matrix::Matrix(){
    double * matrix = NULL;
}

Matrix::Matrix(int N){
    double * matrix = new double[N * N];
    this->rows = N;
    this->columns = N;

    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            if(i==j)
                matrix[i * N + j] = 1;
            else
                matrix[i * N + j] = 0;
        }
    }
}

Matrix::Matrix(int M, int N){
    double * matrix = new double[M * N];
    this->rows = M;
    this->columns = N;

    for(int i = 0; i < M; i++){
        for(int j = 0; j < N; j++)
            matrix[i * N + j] =  0;
    }
}

Matrix::~Matrix(){
    delete [] matrix;
}

我是否正确创建了动态数组和构造函数?我稍后在练习中使用三个不同的构造函数创建三个不同的数组。我该怎么做?如果我尝试这样的事情

Matrix::Matrix();
Matrix::Matrix(3);

或者

Matrix::Matrix(3,4)

我收到以下错误:

Øving_6.exe 中 0x773c15de 处的未处理异常:0xC0000005:访问冲突读取位置 0xccccccc0。

我究竟做错了什么?

4

3 回答 3

5

在您的构造函数中,您正在定义一个局部变量

double * matrix = new double[N * N];

它会隐藏您的同名成员变量,因此该成员永远不会被初始化。

您只需要将其更改为

matrix = new double[N * N];

this->除非绝对有必要消除歧义(这几乎从不),否则用于成员访问是非常不符合 C++的

于 2013-03-12T19:18:54.930 回答
2

您会发现更多“C++”(有时是初始化成员的唯一方法):

Matrix::Matrix(int M, int N):   rows    (M), 
                                columns (N), 
                                matrix  (new double[M * N]) 
{
    for(int i = 0; i < M; i++)
        for(int j = 0; j < N; j++)
            matrix[i * N + j] =  0;

}

现在试着理解这一点:

Matrix::Matrix(       int N):   rows    (N), 
                                columns (N), 
                                matrix  (new double[N * N]) 
{
    for(int i = 0; i < N; i++)
        for(int j = 0; j < N; j++)
            matrix[i * N + j] =  (i==j);

}

如果您使用:

class Matrix{
private:
    int rows;
    int columns;
    std::unique_ptr<double[]> matrix;

你会发现你不需要析构函数和其他一些无关紧要的东西。另外,请阅读我的其他答案。

于 2013-03-13T10:30:08.050 回答
1

在您的三个构造函数中,您将使用本地变量矩阵屏蔽实例变量矩阵。尝试这个:

Matrix::Matrix(){
 this->matrix = NULL;
}

Matrix::Matrix(int N){
 this->matrix = new double[N * N];
 this->rows = N;
this->columns = N;

for(int i = 0; i < N; i++){
    for(int j = 0; j < N; j++){
        if(i==j)
            matrix[i * N + j] = 1;
        else
            matrix[i * N + j] = 0;
    }
}
}

Matrix::Matrix(int M, int N){
 this->matrix = new double[M * N];
this->rows = M;
this->columns = N;

for(int i = 0; i < M; i++){
    for(int j = 0; j < N; j++)
        matrix[i * N + j] =  0;
}

}

于 2013-03-12T19:15:44.440 回答