一个实例影响另一个实例,但它不应该

时间:2011-12-29 13:28:30

标签: c++ matrix instantiation

我制作了一个类型为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;   
}

3 个答案:

答案 0 :(得分:4)

您声明了一个[N][M]数组,但您的初始化代码将其视为[M][N]

答案 1 :(得分:1)

你在m中看到m2的值的事实是因为你的矩阵ctor在数据数组边界之外写入覆盖堆栈附近的任何东西。正是这一行:

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

在数组边界之外写入。

也是你的

ostream& operator<< ()

应该返回值

答案 2 :(得分:-1)

您需要为matrix :: data array分配内存。

你可以这样修改,

T data[N][M]; =&gt; std::vector< std::vector<T> > data;

然后在构造函数中准备好向量,

data.assign(M, std::vector<T>());
for (int x=0; x<M; ++x)
    data[x].assign(N, T());