【问题标题】:Trouble overloading operator >> for a matrix class矩阵类重载运算符 >> 的麻烦
【发布时间】:2011-03-21 02:25:42
【问题描述】:

我正在尝试通过为矩阵类重载>>来学习运算符重载,以通过调用诸如

之类的东西来启用矩阵的基于键盘的输入
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

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;
}

【问题讨论】:

  • @user:请比它不起作用更具体。究竟会发生什么,您期望会发生什么?你能举一个输入、预期输出和实际输出的例子吗?

标签: c++ class operator-overloading


【解决方案1】:

我认为您的operator &gt;&gt; 的问题在于您正在使用Matrix 中已经存在的任何尺寸,而不是尝试从您找到的输入中恢复尺寸。

我认为最好的办法是让operator &lt;&lt; 实现在矩阵前面加上维度信息(例如行数和列数),然后让operator &gt;&gt; 函数读取该信息。例如:

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]]

使用此设置,有关矩阵的大小信息隐含在括号分组的工作方式中。再说一次,这可能会使读取输入变得有点棘手,因为您不会事先知道矩阵有多大。但总体而言,选择对自己最简单的方法。

作为一个仅供参考,您可能不想在编写流插入运算符时使用endl 来分隔行。除了写入换行符之外,endl 还会刷新缓冲区。如果您的流连接到网络连接,您可能不想在矩阵有新行时继续刷新缓冲区,因为这可能导致大量数据以突发(缓慢)发送而不是分组它一次全部(快速)。

希望这会有所帮助!

【讨论】:

  • 有重载cin操作符的选项,在操作符内部获取像1 98 3 5 3这样的数字字符串,并将每个数字插入cin操作符获取的数组中?
【解决方案2】:

我不认为您的代码特别错误。 如果按下,我建议检查循环中的流条件。 供您参考,以下代码在我测试时有效:

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;
}

希望对你有帮助

【讨论】:

    【解决方案3】:
    #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;*/
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多