我参加了有关c ++的考试。以下是说明:
我正在尝试将m2和m3相加并放置m2。但是有一个错误:类型为'Matrix *'和'Matrix *'的无效操作数为二进制'operator +'。
main.cpp:
int main(){
Matrix *m2= new Matrix(3,4,9);
Matrix *m3= new Matrix(3,4,2);
m2= m2+m3;
return 0;
}
matrix.h:
class Matrix{
private:
int x,y;
vector<vector <int> > matris;
public:
Matrix(int row,int col,int z);
Matrix* operator+(Matrix* 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;
}
答案 0 :(得分:0)
您写的运算符可以称为
contains()
但是,getIdinArray()
应该采用makeEmployee()
作为参数并返回// 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);
。只需从代码中删除所有指针,即可使其几乎正确。
答案 1 :(得分:0)
让我们看看您对operator+
的声明
Matrix* operator+(Matrix* no2);
实际上,operator+
是成员函数,因此只能通过对象来调用。
因此,调用m2 + m3
会转换为m2.operator+(m3)
,但是在您的代码m2中是一个指针,因此该语法无效。
您的运营商希望在LHS上使用对象,在RHS上使用指针。
在m2 + m3
中都是指针,没有为其定义合适的运算符。
解决方案
工作量少(难看)
m2 = (*m2)+m3;
在这里,您取消引用m2指向的对象。
更多工作(不那么难看)
m2 = m2+m3;
但是在此之前,您必须为全局2个指针(外部类)定义+
Matrix* operator+(Matrix* m1, Matrix* m2) {
// do stuff
}
您将不得不与公众/朋友一起玩
我了解它是针对类的,但是除非您确实需要重新考虑每个仅对象方法,否则您不应使用指针。
m2 = m2 + m3
中存在内存泄漏(不好的事情,吃了RAM),在这里您要为m2指定新的位置,而不删除旧的指向对象。因此,丢失了一个矩阵对象(> 60-90)字节,您无法访问。
这可以很容易地实现而无需使用指针,您将学到很多东西。注意您的截止日期。希望对您有所帮助。