2011-12-29 117 views
0

我做了一个类型为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; 
} 
+0

好的,谢谢。不知道codereview。我会等几分钟,如果我没有得到答案,我会在那里发布它... – Novellizator 2011-12-29 13:34:57

+0

Codereview不是问“为什么不这样做,我认为它做”。 – 2011-12-29 13:36:32

+1

@Tomy - 你可以在某些地方使用'矩阵',在其他地方使用'矩阵'。这是故意的吗? – 2011-12-29 13:43:28

回答

4

你声明的[N][M]一个数组,但你的初始化代码把它当作好像它是[M][N]

-1

您需要为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()); 
1

你以米看到M2值事实上是因为你的矩阵ctor在数据数组边界之外写入,覆盖堆栈中靠近的任何东西。正是这条线:

data[i][j] = v[k]; 

写入数组边界之外。

也是你

ostream& operator<<() 

应该返回值

相关问题