[英]Trouble overloading operator >> for a matrix class
我试图通过处理重载>>来学习运算符重载,用于矩阵类,通过调用sth来启用矩阵的基于键盘的输入
Matrix M1;
cin >> M1;
操作符重载部分如下所示
istream &operator>>(istream &in, Matrix &m)
{
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
in >> m.p[i][j];
}
return in;
}
它变成了我的实现根本不正确的工作。 你能告诉我为什么这个实现错了吗?
我通过模仿现有的重载>>实现上面的部分,已经证明在矩阵输出部分工作得很好,比如cout << A; 其中A是矩阵
ostream &operator<<(ostream &out, const Matrix &m)
{
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
out << m.p[i][j] << " ";
out << endl;
}
return out;
}
我相信你的operator >>
的问题在于你正在使用已经碰巧在Matrix
中的任何维度,而不是试图从你找到的输入中恢复维度。
我认为你最好的选择是让operator <<
implementation在矩阵中加上维度信息(例如行数和列数),然后在该信息中读取operator >>
函数。 例如:
ostream &operator<<(ostream &out, const Matrix &m)
{
out << m.dx << ' ' << out.dy << '\n';
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
out << m.p[i][j] << " ";
out << endl;
}
return out;
}
有了这个,您可以将您的流提取运算符编写为
istream &operator>>(istream &in, Matrix &m)
{
in >> m.dx >> m.dy;
/* Some sort of logic to ensure that you've allocated an array large enough to
* hold all the elements ...
*/
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
in >> m.p[i][j];
}
return in;
}
这可能不是最美观的输入和输出操作员,但他们应该完成工作。
如果要使这些运算符更有分类,可以考虑使用一些特殊字符输出矩阵的元素来分隔行和列。 例如,您可以尝试输出矩阵
0 1 2
3 4 5
6 7 8
如
[[0 1 2][3 4 5][6 7 8]]
使用此设置,有关矩阵的大小信息隐含在括号分组的工作方式中。 然后,这可能会使读取输入变得有点棘手,因为您事先不知道矩阵有多大。 但是总体来说,最简单的方法就是自己。
作为一个FYI,您可能不希望在编写流插入运算符时使用endl
来分隔行。 除了编写换行符之外, endl
还会刷新缓冲区。 如果您的流连接到网络连接,您可能不希望在有新的矩阵行时继续刷新缓冲区,因为这可能导致大量数据以突发形式发送(慢速)而不是对其进行分组一下子(快)。
希望这可以帮助!
#include<iostream>
using namespace std;
class Array /*overload of subscript operator of 1D array*/
{
private: int *p;
public:
int length;
Array(int size = 0): length(size)
{
p=new int(length);
}
int& operator [](const int k)
{
return p[k];
}
};
class Matrix
{
private: Array *p;
public:
int r,c;
Matrix(int i=0, int j=0):r(i), c(j)
{
p= new Array[r];
}
Array& operator [](const int& i)
{
return p[i];
}
friend istream& operator >> (istream& in, Matrix& m);
/*friend ostream& operator << (ostream& out, Matrix& m);*/
};
istream& operator >> (istream& in, Matrix& m)
{
for(int i=0 ; i < m.r ; i++)
{
for(int j=0 ; j < m.c ; j++)
in >> m[i][j];
}
}
/*ostream& operator << (ostream& out, Matrix& m)
{
for(int i=0 ; i < m.r ; i++)
{
for(int j=0 ; j < m.c ; j++)
out << m[i][j] << " ";
out << endl;
}
}*/
/*Driver program*/
int main()
{
Matrix M1(3,3); /*for checking purpose*/
cin >> M1;
/*cout << "\n" << M1;*/
}
我不认为你的代码特别错。 如果按下,我建议检查循环中的流状况。 为了您的信息,以下代码在我测试时起作用:
struct Matrix {
static int const dx = 2, dy = 2;
int p[ dx ][ dy ];
};
istream &operator>>(istream &in, Matrix &m)
{
for (int i = 0; i < m.dx; ++i) {
for (int j = 0; j < m.dy; ++j)
if ( ! (in >> m.p[i][j]) ) return in;
}
return in;
}
int main() {
Matrix M1;
cin >> M1;
cout << M1;
}
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.