Copy-Constructor无法正常工作

时间:2015-01-06 11:40:17

标签: c++

我编写了一个C ++程序,其中一个复制构造函数是其中的一部分。程序正在使用矩阵,我使用复制构造函数来创建一个新矩阵(当然,这就像第一个)。

当我使用像3 3这样的源矩阵时,它工作正常,但是当我使用(例如)3 2矩阵时,复制构造函数不起作用。问题很奇怪,请亲自试试,这是代码:

#include <iostream>
#include <stdlib.h>
using namespace std;

class Matrix {

private:
    //Zeiger auf den Array, der die Matrix darstellt.
    double* m;
    //Zeilenanzahl
    size_t rows;
    //Spaltenanzahl
    size_t cols;

public:
    Matrix(size_t r, size_t c) {
        m = new double[r * c];
        rows = r;
        cols = c;

        cout << "Konstruktor für " << this << endl;
    }

    //Copy-Konstruktor
    Matrix(const Matrix &obj) {

        cout << "Copy-Constructor" << endl;

        rows = obj.rows;
        cols = obj.cols;
        m = new double[rows*cols];

        //neuen Array m mit Werten füllen
        for (size_t row = 0; row < rows; ++row) {
            for (size_t col = 0; col < cols; ++col) {
                m[row * rows + col] = obj.get(row, col);
            }
        }
    }

    size_t numRows() const {
        return rows;
    }

    size_t numCols() const {
        return cols;
    }

    void set(int row, int col, double value) {
        m[row * rows + col] = value;
    }

    int get(int row, int col) const {
        return m[row * rows + col];
    }

    ~Matrix() {
        cout << "Destruktor für " << this << endl;
        delete[] m;
        m = 0;
    }

};

//Matrix wird in die Konsole geschrieben
void print(const Matrix &m) {

    for (size_t row = 0; row < m.numRows(); ++row) {
        for (size_t col = 0; col < m.numCols(); ++col) {

            cout << m.get(row, col) << "\t";

        }
        cout << endl;
    }

}

int main(int argc, char* argv[]) {

    cout << "Programmstart" << endl;

    if (argc < 3) {
        cout << "Brauche Anzahlen von Zeilen und Spalten für Matrizen!" << endl;
        return 1;
    }

    int rows = atoi(argv[1]);
    int cols = atoi(argv[2]);

    Matrix m1(rows, cols);

    for (size_t row = 0; row < m1.numRows(); ++row) {
        for (size_t col = 0; col < m1.numCols(); ++col) {
            double value = row + col;
            // Mit Matrix::set() soll dem Element in der angegebenen Zeile und
            // Spalte ein Wert zugewiesen werden können.
            m1.set(row, col, value);
        }
    }
    cout << "m1 Element (0, 0) ist: " << m1.get(0, 0) << endl;

    cout << "m1:" << endl;
    print(m1);

    Matrix m2(m1);
    cout << "m2:" << endl;
    print(m2);

    cout << "Programmende" << endl;
}

我希望有人看到这个问题。

1 个答案:

答案 0 :(得分:2)

m[row * rows + col] = obj.get(row, col);应该是

m[row * cols + col] = obj.get(row, col);

同时将get方法修改为:

int get(int row, int col) const {
   return m[row * cols + col];
}