gpt4 book ai didi

c++ - 重载 << 运算符以在模板类中打印矩阵的元素

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:02 24 4
gpt4 key购买 nike

为什么我在运算符“[]”上出错。我想打印矩阵的内容。如果我不能使用括号,那我该怎么办?

这是代码示例:

#include <iostream>
#include <vector>

template <typename T>
class Matrix {
private:
int m; int n;
std::vector<T> x;
std::vector<std::vector<int>> Mat;


public:
Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x);
Matrix(const Matrix &M);
Matrix<T> operator = (const Matrix &M);
// Matrix<T> operator [](const int &index);

friend std::ostream& operator << (std::ostream& os, const Matrix<T> &M) {
os << "[";
for (int i = 0; i< M.m; i++){
for (int j = 0; j< M.n; j++){
os << M[i][j] << ' ';
}
os << '\n';
}
os << "]\n";
return os;
}
};

我已经修正了错误。但它不打印我的矩阵。这是我的主要内容:

int main(){
std::vector<int> x = {1,2,3,4};
Matrix<int> A{2,2,x};
Matrix<int> B{2,2,x};
std::cout << A;
std::cout << B;
return 0;
}

这是我的构造函数,我需要从指定行和列的 vector 创建矩阵。

template <typename T>
Matrix<T>::Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x){ //constructor
this -> m = m;
this -> n = n;
this -> x = x;

int index = 0;
for (int i = 0; i<m; i++){
for (int j = 0; j<n; j++){
Mat[i][j] = x[index];
index++;
}
}
}

最佳答案

问题是这一行:

os << M[i][j] << ' ';

因为 M 的类型是 Matrix<T>你还没有定义 []运算符(operator),任何使用 [] 的尝试运算符(operator)会给你错误。

相反,您应该使用数据成员 Mat .

friend std::ostream& operator << (std::ostream& os, const Matrix<T> &M) {
os << "[";
for (int i = 0; i< M.m; i++){
for (int j = 0; j< M.n; j++){
os << M.Mat[i][j] << ' '; // using M.Mat instead of M
}
os << '\n';
}
os << "]\n";
return os;
}

编辑:

根据您更新的代码,您可能会遇到一个不错的 SIGSEGV 错误(段错误)问题。为什么?简单的。您没有调整数据成员的大小 Mat .

你必须这样做:

template <typename T>
Matrix<T>::Matrix (const unsigned int &m, const unsigned int &n, std::vector<T> x){ //constructor
this -> m = m;
this -> n = n;
this -> x = x;

int index = 0;

// resizing Matrix according to our need i.e. m rows and n columns
Mat.resize(m);
for (unsigned int i = 0; i < Mat.size(); i++) {
Mat[i].resize(n);
}

for (unsigned int i = 0; i<m; i++){
for (unsigned int j = 0; j<n; j++){
Mat[i][j] = x[index];
index++;
}
}
}

关于c++ - 重载 << 运算符以在模板类中打印矩阵的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721278/

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