试图重载求和操作符"+"但是不能正确地定义类构造函数



所以我要做的是使和运算符做类的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; }这样的构造函数这数目加不起来。有什么想法吗?

我可以想到两个方法来解决你的问题。第一种是好的,并且是根据操作符重载的基本规则完成的,第二种是合理的(如果我们假设Baza构造函数绝对必须将5添加到a)。

1。根据operator+=

实现operator+

在这个方法中,您首先实现operator +=,然后,您可以通过在operator+中获取副本来使用它。它也可以通过手动编写副本来完成,这可能会产生更少的wtf/分钟。
最好将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;
}

最新更新