试图重载求和运算符“+”但无法正确定义类构造函数 1.根据 operator+2.提供另一个构造函数,它不会做任何恶作剧

问题描述

所以我想要做的是让 sum 运算符执行类的 2 个元素中的一些,但是在修改类构造函数时我遇到了问题 在这代码

#include<iostream>
using namespace std;

class Baza {
public:
    int a;
    int b;
    int c;

    Baza(double x,double y){
        this->a=x;
        this->b=y;
    }
    
    Baza Suma(const Baza& val) const{
        return Baza(a+val.a,b+val.b);
        
    }
    Baza operator+(const Baza& val) const{
        return Suma(val);
    }

    
};


class Derivata : public Baza {
    
public:
    int o;
    int p;
    Derivata(double x,double y) : Baza(x,y){
    this->o = x ;
    this->p = y;
    }
    Derivata Suma(const Derivata& val) const{
        return Derivata(a+val.a,b+val.b);
    }
    Derivata operator+(const Derivata& val) const{
        return Suma(val);
    }

    
};



ostream& operator<<(ostream& os,const Baza& val) {
    os << val.a << ',' << val.b;
    return os;
}

int main() {
    Baza obd1(2,3);
    cout << obd1 << endl;
    Baza obd2(4,5);
    cout << obd2 << endl;
    Baza obd3 = obd1 + obd2;
    cout << obd3 << endl;
    /*
    Derivata obiect1(5,6);
    Derivata obiect2(10,3);
    Derivata obiect3 = obiect1 + obiect2;
    cout << obiect3 << endl;
    return 0;
    */
}

算法有效,为对象 ob1 和 ob2 求和,但如果我试图像这样更改“Baza”构造函数 Baza(double x,double y){ this->a=x + 5; this->b=y; } 总和不会加起来。有什么想法吗?

解决方法

我可以想到两种方法来解决您的问题。一个是好的,根据 basic rules of operator overloading 完成,第二个有点合理(如果我们假设 Baza 构造函数绝对必须将 5 添加到 a)。

1.根据 operator+

实现您的 operator+=

在此方法中,您首先实现 operator +=,然后您可以通过在 operator+ 中复制来使用它。也可以通过手动写副本来完成,这可能会产生less WTFs/minute
最好以非成员身份实现 operator+,但我不想对您的代码进行过多更改。

Baza& operator+= (const Baza& val)
{
    a += val.a;
    b += val.b;
}

Baza operator+(Baza val) const {
    return val += (*this);
}

// Baza operator+(const Baza& val) const {
   // Baza copy = *this;
   // return copy += val;
// }

2.提供另一个构造函数,它不会做任何恶作剧

注意,这个方法直接修改成员,这意味着你也可以使用你原来的构造函数,但是如果你唯一的其他构造函数对数据做一些事情,那么使用默认构造函数仍然是个好主意(这些东西有时是不受欢迎的) .

Baza()
{
    a = 0;
    b = 0;
}

Baza operator+(const Baza& val) const{
    Baza ret;
    ret.a = a + val.a;
    ret.b = b + val.b;
    return ret;
}