我编写了一个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;
}
我希望有人看到这个问题。
答案 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];
}