gpt4 book ai didi

c++ - 一个实例会影响另一个实例,尽管它不应该

转载 作者:行者123 更新时间:2023-11-27 23:26:48 25 4
gpt4 key购买 nike

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

关于c++ - 一个实例会影响另一个实例,尽管它不应该,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com