C++中如何重载输入输出流运算符使其可用于矩阵的输入输出?

代码如下,怎么改:

class Matrix
{
public:
Matrix();
friend istream& operator >> (istream&,Matrix&);
friend ostream& operator << (ostream&,Matrix&);
friend Matrix operator + (Matrix &a,Matrix &b);
private:
int term[2][3];
};

Matrix::Matrix()
{
int i,j;
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{
term[i][j]=0;
}
}
}

Matrix operator + (Matrix &a,Matrix &b)
{
int i,j;
Matrix c;
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{

c.term[i][j]=a.term[i][j]+b.term[i][j];
}
}
return c;
}

istream & operator >> (istream & input,Matrix & a)
{
int i,j;
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{
input>>term[i][j];
}
}
return input;
}

ostream & operator << (istream& output,Matrix& a)
{
int i,j;
for (i=0;i<=1;i++)
{
for (j=0;j<=2;j++)
{
output<<term[i][j];
}
}
return output;
}

int main()
{
Matrix a,b,c;
cout<<"a-->Input:"<<endl;
cin>>a;
cout<<"a="<<a<<endl;
cout<<"b-->Input:"<<endl;
cin>>b;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
c = a + b;
cout<<"c=a+b="<<c<<endl;
}

可以将矩阵封装成一个类,然后重载该类的输入输出函数。

参考代码如下:

class matrix
{
    public:
        int ** p;
        int x,y;
        matrix(int m, int n)
        {
            x = m;
            y = n;
            p = new int*[x];
            for(int i = 0; i < x; i ++)
                p[i] = new int[y];
        }
};//定义类。
istream & operaroy >> (istream & in, matrix & v)//重载输入>>。
{
    for(int i = 0; i < x; i++)
        for(int j = 0; j < y; j++)
            in>>v.p[i][j];
    return in;
}

ostream &operator<<(ostream & out, const matrix &v)//重载输出<<。
{
    for(int i = 0; i < x; i++)
    {
        for(int j = 0; j < y; j++)
            out<<v.p[i][j]<< ',';
        out << endl;
    }
    return out;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-12-06
#include<iostream>
using namespace std;
class Matrix                                                           
{
public:
    Matrix();
    friend istream& operator >> (istream&,Matrix&);
    friend ostream& operator << (ostream&,Matrix&);
    friend Matrix operator + (Matrix &a,Matrix &b);
private:
    int term[2][3];
};

Matrix::Matrix()
{
    int i,j;
    for (i=0;i<=1;i++)
    {
        for (j=0;j<=2;j++)
        {
            term[i][j]=0;
        }
    }
}

Matrix operator + (Matrix &a,Matrix &b)
{
    int i,j;
    Matrix c;
    for (i=0;i<=1;i++)
    {
        for (j=0;j<=2;j++)
        {
            
            c.term[i][j]=a.term[i][j]+b.term[i][j];
        }
    }
    return c;
}

istream & operator >> (istream & input,Matrix & a)
{
    int i,j;
    for (i=0;i<=1;i++)
    {
        for (j=0;j<=2;j++)
        {
            input>>a.term[i][j];
        }
    }
    return input;
}

ostream & operator << (ostream& output,Matrix & a)
{
    int i,j;
    for (i=0;i<=1;i++)
    {
        for (j=0;j<=2;j++)
        {
            output<<a.term[i][j];
        }
    }
    return output;
}

int main()
{
    Matrix a,b,c;
    cout<<"a-->Input:"<<endl;
    cin>>a;
    cout<<"a="<<a<<endl;
    cout<<"b-->Input:"<<endl;
    cin>>b;
    cout<<"b="<<b<<endl;
    cout<<"c="<<c<<endl;
    c = a + b;
    cout<<"c=a+b="<<c<<endl;
}

追问

用VC++6.0编译还是出错,提示为:fatal error C1001: INTERNAL COMPILER ERROR

追答

这个不是代码问题报错。

而是你工程类型和设置决定了,必须使用“预编译头文件“

如果其它设置没错,那么在你的代码最上边一行加上:

#include "stdafx.h"

呵呵,上面已经告诉你了,”其它设置错误“
去掉stdafx包含,然后这样设置吧:
在project->setting->c/c++ ->category里选 precompiled header
选not using precompiled header,确定,重新编译。

追问

还是不行,有其他解决办法么?

追答

重建一个配置正确的工程。

本回答被提问者采纳

c++中怎么自己实现输入和输出?
在 C++ 中实现文件的输入与输出,可以通过 istream 和 ostream 类及其派生类完成。这些类直接或间接关联到物理文件,通过文件流对象如 myfile 操作文件。文件操作的第一个步骤通常是打开文件,这可以通过流对象的成员函数 open 来实现,参数包括文件名和可选的模式标志,如 ios::binary。如果文件打开成功...

Linux中C++执行命令行命令后,在它运行中时,如何再进一步输入?
linux的终端也是个进程嘛,终端里的运行程序就是终端的子进程呗,终端里按Ctrl+C能结束程序,大概是因为终端检测到按键按了Ctrl+C就向程序发送信号SIGINT(signal interrupt),程序接收到SIGINT调用默认的处理函数就会退出。所以你想用一个进程去结束另一个进程,一个方法就是发信号(signal)。至于你那个试图...

c++中文件的读入和输出是怎么样的?
在C++中,有一个stream这个类,所有的I\/O都以这个“流”类为基础的,包括我们要认识的文件I\/O,stream这个类有两个重要的运算符:1、插入器(<<)向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\\n';就表示把字符串"Write S...

C++重载运算符。 太TM难了。 进来看看
注:cout和cin都是C++中iostream类的一个对象,对于cout<<使用的<<运算符,是在类中被重载了的,因此<<运算符就是一个重载的操作运算符。将操作符重载函数声明为友元时,这时的操作符重载函数必须多一个形参,若操作符成员函数是类的成员函数,则要少一个形参,还有,有些操作符重载函数必须声明为友...

C语言中有输出格式控制,C++怎么实现?
大部分流的输入输出格式可以用setf函数来设置。该函数有两种重载形式。其但参数的setf原型为:fmtflage setf(fmtfalg flag)参数flag说明所要设置的格式,由ios_base给出,可取如下枚举常量:enum{ left =0x0001, \/\/在域中靠左输出 right =0x0002, \/\/在域中靠右输出 internal =0x0004...

什么是C++重载?
为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题,不能只有函数返回值类型不同。

__int64在C++中怎么用输入输出流 好像不能直接用cout cin 啊
虽然c++支持__int64这种数据格式,但是标准输入输出流是不支持这种数据类型的,所以你需要重载<<,>>符号。

c++输入输出流(万字超详细解析)
文件输入输出流的特点是打开->操作->关闭。读写二进制文件可以通过read\/write完成,二进制文件读写效率较高。streambuf是STL提供的缓冲区类,提供给输入输出流使用。每个标准的输入输出流对象都包含一个streambuf的指针,可以通过调用rdbuf()获取该指针,从而直接访问底层streambuf对象。streambuf支持<>操作...

c++中重载输出操作符,为什么要返回引用
1.第一个形参为对ostream对象的引用,在该对象上将产生输出,ostream为非const,因为写入到流会改变流的状态;该形参是一个引用,因为不能复制ostream对象(在c++中定义的标准输入输出流类istream和ostream,其中拷贝构造函数和赋值操作符函数都被放置在了private部分,且只有声明,没有定义)。2.第二个...

重载详细解读
编译器会优先考虑完全匹配和类型转换,如提升匹配和标准转换,甚至用户自定义转换。在C++中,函数重载不仅限于名称相同,也包括流操作符如>>和<<的重载,以及自定义类型与标准类型之间的输入输出操作。运算符重载则允许同一运算符处理不同类型的数据,如"+"运算符在整数、浮点数和字符串中的应用。

相似回答