一个实例影响另一个实例但它不应该
问题描述:
我做了一个类型为T的矩阵类MxN,并试图实例化并打印它。 一个问题上升,你看到在代码的末尾(当我做cout << m;
) 该命令打印出一个矩阵与另一个矩阵的一些字段 - 实际上m
的第一列与最后一列m2
相同和我不明白为什么?一个实例影响另一个实例但它不应该
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <stdexcept>
using namespace std;
template<typename T, int M>
class matrix_helper {
public:
T& operator[](int j) {
return data[j];
}
private:
T data[M];
};
template<typename T, int N, int M>
class matrix {
public:
explicit matrix(const vector<T>& v) {
if (v.size() != M * N)
throw invalid_argument("Incorrect input data");
int i=0, j=0;
for (int k = 0; k != M*N; ++k) {
data[i][j] = v[k];
++i;
if (i == M) { // i:0..M
i = 0;
++j;
}
}
}
matrix_helper<T,M> operator[](int j) {
matrix_helper<T, M> mh;
for(int i=0; i != M; ++i) {
mh[i] = data[j][i];
}
return mh;
}
matrix<T,M,N>& operator+=(matrix<T,M,N>& m) {
for(int i=0; i != N;++i)
for(int j=0; j != M;++j) {
this->data[i][j] += m[i][j]; // or - should I rather use (*this)[i][j] += ... ???
}
return *this;
}
private:
T data[N][M];
};
template<typename T, int N, int M>
ostream& operator<<(ostream& os, matrix<T,N,M> & m) {
int i=0, j=0;
for (int k = 0; k != M*N; ++k) {
os << m[i][j] << '\t';
++i;
if (i == M) { // i:0..M
i = 0;
++j;
os << endl;
}
}
os << endl;
}
int rnd(int max = 20) { return rand() % max; }
void print(int i) { cout << i << ' '; }
int main() {
vector<int> u, v;
for (int i = 0; i != 20; ++i) u.push_back(i);
for (int i = 20; i != 40; ++i) v.push_back(i);
//for_each(u.begin(), u.end(), print);
matrix<int, 4,5> m(u);
matrix<int, 4,5> m2(v);
cout << m; // returns: 24 1 2 3 4,... Why not 0 1 2 3 4 ???
cout << endl;
system("pause");
return 0;
}
答
你声明的[N][M]
一个数组,但你的初始化代码把它当作好像它是[M][N]
。
答
您需要为matrix :: data数组分配内存。
您可以修改这个样子,
T data[N][M];
=>std::vector< std::vector<T> > data;
在构造函数然后准备载体,
data.assign(M, std::vector<T>());
for (int x=0; x<M; ++x)
data[x].assign(N, T());
答
你以米看到M2值事实上是因为你的矩阵ctor在数据数组边界之外写入,覆盖堆栈中靠近的任何东西。正是这条线:
data[i][j] = v[k];
写入数组边界之外。
也是你
ostream& operator<<()
应该返回值
好的,谢谢。不知道codereview。我会等几分钟,如果我没有得到答案,我会在那里发布它... – Novellizator 2011-12-29 13:34:57
Codereview不是问“为什么不这样做,我认为它做”。 – 2011-12-29 13:36:32
@Tomy - 你可以在某些地方使用'矩阵',在其他地方使用'矩阵'。这是故意的吗? –
2011-12-29 13:43:28