5

現在、次の演習を行っています。

ジェネリックMatrixクラス(15ポイント)

a)Matrixというクラスを作成します。このクラスには、double型のM*N数のストレージが含まれている必要があります。以前と同じように、データの保存方法を選択するときは、後でデータを何に使用するかを知っておくと便利なことがよくあります。行列操作では、列や行に基づいて行列のさまざまな要素にアクセスするため、行列のメンバーを配列として並べ替えると便利です。また、マトリックスに格納されているデータのサイズを変更する必要があるため、動的に割り当てる必要があります。

b)マトリックスのコンストラクターを作成します。

次の3つのコンストラクターを作成します。Matrix()•デフォルトのコンストラクター。マトリックスを無効な状態に初期化する必要があります。

明示的な行列(unsigned int 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;
}

動的配列とコンストラクターを正しく作成しましたか?演習の後半で、3つの異なるコンストラクターを使用して3つの異なる配列を作成します。どうすればこれを正しく行うことができますか?私がこのようなことをしようとしたら

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

3つのコンストラクターでは、インスタンス変数マトリックスをローカルのものでマスクしています。これを試して:

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 に答える