我做了一个类型为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;
}
好的,谢谢。不知道codereview。我会等几分钟,如果我没有得到答案,我会在那里发布它... – Novellizator 2011-12-29 13:34:57
Codereview不是问“为什么不这样做,我认为它做”。 – 2011-12-29 13:36:32
@Tomy - 你可以在某些地方使用'矩阵',在其他地方使用'矩阵'。这是故意的吗? –
2011-12-29 13:43:28