c++;错误:类型为';矩阵*';和';矩阵*';到二进制';操作员+'; 我有一个关于C++的考试。以下为详细说明: 矩阵*m2=新矩阵(3,4,9); → 带9的3x4矩阵 矩阵运算→ m2=m2+m3

c++;错误:类型为';矩阵*';和';矩阵*';到二进制';操作员+'; 我有一个关于C++的考试。以下为详细说明: 矩阵*m2=新矩阵(3,4,9); → 带9的3x4矩阵 矩阵运算→ m2=m2+m3,c++,matrix,operator-overloading,C++,Matrix,Operator Overloading,我试图求m2和m3之和,并将m2相加。但有一个错误:“矩阵*”和“矩阵*”类型的操作数对二进制“运算符+”无效 main.cpp: int main(){ Matrix *m2= new Matrix(3,4,9); Matrix *m3= new Matrix(3,4,2); m2= m2+m3; return 0; } 矩阵h: class Matrix{ private: int x,y;

我试图求m2和m3之和,并将m2相加。但有一个错误:“矩阵*”和“矩阵*”类型的操作数对二进制“运算符+”无效

main.cpp:

    int main(){
     Matrix *m2= new Matrix(3,4,9);
     Matrix *m3= new Matrix(3,4,2);

     m2= m2+m3;

     return 0;
     }
矩阵h:

      class Matrix{

      private:
      int x,y;
      vector<vector <int> > matris;

      public:
      Matrix(int row,int col,int z);
      Matrix* operator+(Matrix* no2);
      };
类矩阵{
私人:
int x,y;
向量矩阵;
公众:
矩阵(int行,int列,int z);
矩阵*运算符+(矩阵*no2);
};
Matrix.cpp:

  Matrix::Matrix(int row,int col, int z){

        Matrix::x=row;
        Matrix::y=col;

        for(int i=0;i<x;i++){
            matris.push_back(vector <int>(y));
        }

        for(int i=0;i<Matrix::x;i++){
            for(int j=0;j<Matrix::y;j++){
                Matrix::matris[i][j]=z;
            }
          }
        }

Matrix* Matrix::operator +(Matrix* no2){

    Matrix* temp = new Matrix(this->x,this->y,0);

    for(int i=0;i<this->x;i++){
        for(int j=0;j<this->y;j++){
            temp->matris[i][j]=this->matris[i][j]+ no2->matris[i][j];
        }
    }
    return temp;
}
矩阵::矩阵(int行,int列,int z){ 矩阵::x=行; 矩阵::y=col; 对于(inti=0;imatris[i][j]=this->matris[i][j]+no2->matris[i][j]; } } 返回温度; }
您编写的运算符可以称为

// this is only for demonstration, not real code!
Matrix *m_p1;
Matrix *m_p2;
Matrix m3;   
//...
m_p2 = m3 + m_p1;
// exactly the same as
m_p2 = m3.operator+(m_p1);

但是,
运算符+
应该将
常量矩阵&
作为参数,并返回
矩阵
。只需从代码中删除所有指针,它就几乎正确了。

让我们看看您对
运算符+
的声明

矩阵*运算符+(矩阵*no2);
实际上,
operator+
是一个成员函数,因此只能通过对象调用它

因此调用
m2+m3
转换为
m2.operator+(m3)
,但在代码中,m2是指针,此语法无效

操作员希望左侧有一个对象,右侧有一个指针

m2+m3
中,两者都是指针,没有为其定义合适的运算符

解决方案

工作少(丑)

m2=(*m2)+m3;
在这里,您将取消对m2指向的对象的引用

更多的工作(不那么难看)

m2=m2+m3;
但在此之前,您必须为全局(类外)的2个指针定义
+

矩阵*运算符+(矩阵*m1,矩阵*m2){
//做事
}
你必须和公众/朋友一起玩

我理解这是为了类,但除非你真的需要重新考虑每一种只使用对象的方法,否则你不应该使用指针

m2=m2+m3
中存在内存泄漏(糟糕的是,内存被占用),您正在分配m2新位置,而没有删除旧的指针对象。因此,有一个矩阵对象(>60-90)字节丢失,您无法访问


不使用指针就可以很容易地做到这一点,你会学到很多。注意你的截止日期。希望它能有所帮助。

你为什么在这里使用指针?这回答了你的问题吗?@Axalo不,它没有。问题是指针不是全局的vs成员
矩阵*m2=新矩阵(3,4,9)
--不。去掉所有的指针,如果不是所有的问题都会得到解决的话,那么大部分问题都会得到解决。没有任何理由在你的程序中有一个新的
,因为默认情况下
Matrix
是可以复制的,没有任何问题。如果它需要访问私有数据,他可以在类中声明它为
friend Matrix*operator+(矩阵*m1,矩阵*m2){/*do stuff*/}
函数声明将以类和友元作为前缀,而定义应该在外部,在定义之前不需要前缀友元。