0

好的,所以我正在尝试编写一个构建 2D 矩阵的模板,我希望 >> 和 << 正常工作,这是我到目前为止的代码,但我迷路了。我现在有输入和输出函数来通过填充模板来运行用户,所以我希望能够 cin 和 cout 模板。

#include <iostream>
#include <cstdlib>

using namespace std;

template <typename T  > 
class Matrix
{
    friend ostream &operator<<(ostream& os,const Matrix& mat);
    friend istream &operator>>(istream& is,const Matrix& mat);
    private:
        int R; // row
        int C; // column
        T *m;  // pointer to T
  public:
   T &operator()(int r, int c){ return m[r+c*R];}
   T &operator()(T a){for(int x=0;x<a.R;x++){
    for(int z=0;z<a.C;z++){
        m(x,z)=a(x,z);
    }   
   }
   }
   ~Matrix();
   Matrix(int R0, int C0){ R=R0; C=C0; m=new T[R*C]; }
   void input(){
       int temp;
       for(int x=0;x<m.R;x++){
           for(int y=0;y<m.C;y++){
               cout<<x<<","<<y<<"- ";
               cin>>temp;
               m(x,y)=temp;
           }
       }
   }
 };

// istream &operator>>(istream& is,const Matrix& mat){
//     is>>mat 
// };

ostream &operator<<(ostream& os,const Matrix& mat){
     for(int x=0;x<mat.R;x++){
         for(int y=0;y<mat.C;y++){
             cout<<"("<<x<<","<<y<<")"<<"="<<mat.operator ()(x,y);
         }

     }
 };

int main()
{
        Matrix<double> a(3,3);
        a.input();
        Matrix<double> b(a);
        cout<<b;

        cout << a(1,1);
}
4

1 回答 1

0

这是我在您的代码中发现的所有问题。让我们从头开始:

  • 错误的函数返回类型和赋值通过this

    T operator>>(int c)
    {
        this = c;
    }
    

    为什么这段代码是错误的?嗯,我注意到的第一件事是你的函数正在返回,T但你的块中没有 return 语句。忘记我在评论中所说的话,您的插入/使用运算符应该返回*this. 因此,您的返回类型应该是Maxtrix&.

    我在此代码段中看到的另一个错误是您正在分配this指针。这不应该为你编译。相反,如果您打算更改某个数据成员(最好是您的C数据成员),它应该看起来像这样:

    this->C = c;
    

    反过来,你的函数应该是这样的:

    Matrix& operator>>(int c)
    {
        this->C = c;
        return *this;
    }
    
  • this->(z, x)

    output函数的内部 for 循环中,您执行了以下操作:

    cout << "(" << z << "," << x << ")" << "=" << this->(z, x) << endl;
    

    this->(z, x)没有按照你的想法做。它不会同时访问矩阵的两个数据成员。由于语法无效,它实际上会导致错误。您必须单独访问数据成员,如下所示:

    ... << this->z << this->x << endl;
    

    此外,此output函数不需要返回类型。做吧void

    请注意,您的input函数中存在相同的问题。

于 2013-05-02T01:58:01.020 回答