我正在尝试重载加法运算符。我想要实现的是,当item1 + item2
加在一起时,units_sold
的数量会增加并增加收入。在这个例子中,我假设条目的ISBN是相同的。我没有在下面的代码中显示检查,但我在实际代码中这样做。也就是说,ISBN不会添加但在输出中保持不变。
问题代码:
Sales_data Sales_data::operator + (const Sales_data & data1, const Sales_data
& data2) {
return Sales_data(data1.units_sold + data2.units_sold);
return Sales_data(data1.revenue + data2.revenue);
}
我不确定我是否不能使用这样的两个返回但不确定如何为Sales_data
变量的组件添加多个添加。这是一个说明问题的完整示例:
#include <iostream>
#include <string>
struct Sales_data {
std:: string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
};
// overload istream in order for cin to work
std::istream& operator >> (std::istream & in, Sales_data & cSales_data) {
in >> cSales_data.bookNo >> cSales_data.units_sold >> cSales_data.revenue;
return in;
}
// overload ostream in order for cout to work
std::ostream& operator << (std::ostream & out,
const Sales_data & cSales_data) {
out << cSales_data.bookNo << ", " << cSales_data.units_sold << ", "
<< cSales_data.revenue;
return out;
}
// addition operator rules
Sales_data Sales_data::operator + (const Sales_data & data1, const Sales_data
& data2) {
return Sales_data(data1.units_sold + data2.units_sold);
return Sales_data(data1.revenue + data2.revenue);
}
int main() {
Sales_data, item1, item2, total;
std::cin >> item1 >> item2 >> std::endl;
total = item1 + item2;
std::cout << total << std::endl;
}
我收到的错误消息是
error: ‘Sales_data Sales_data::operator+(const
Sales_data&, const Sales_data&)’ must take either zero or one argument
& data2) {
^
In function ‘int main(int, char**)’:
error: no match for ‘operator+’ (operand types are
‘Sales_data’ and ‘Sales_data’)
total = item1 + item2;
在消息中,我尝试了data1()
和data2()
我试图重载加法运算符,在同一段代码中,我尝试了const Sales_data()
但是没有'似乎也是这样做的。
我也尝试了Sales_data & Sales_data::operator+
,但产生了同样的错误。
如何正确地为operator+
重载Sales_data
?
答案 0 :(得分:1)
在这种情况下,错误消息非常有用:
error: ‘Sales_data Sales_data::operator+(const
Sales_data&, const Sales_data&)’ must take either zero or one argument
& data2) {
有两个operator+
:一元(+x
)和二元{(a + b
)。 成员运算符的重载版本分别采用零和一个参数 - 而您编写的定义则带有两个参数。这就是错误:它是一个无效的签名。
我猜你真的打算写一个普通的非成员二进制文件operator+
,所以Sales_data::
是多余的并且是错误的。正确的运算符是:
Sales_data operator +(const Sales_data& data1, const Sales_data& data2)
{
assert(data1.bookNo == data2.bookNo);
return Sales_data{data1.bookNo,
data1.units_sold + data2.units_sold,
data1.revenue + data2.revenue};
}
作为成员运算符,data1
参数将被隐式this
替换:
struct Sales_data {
...
Sales_data operator+(const Sales_data& data);
};
Sales_data Sales_data::operator+(const Sales_data& data2) {
assert(bookNo == data2.bookNo);
return Sales_data{bookNo,
units_sold + data2.units_sold,
revenue + data2.revenue};
}
答案 1 :(得分:1)
首先:有两种方法可以声明二进制文件operator+
,并且你已经混合使用了这两种方法:
class Sales_data {
///select ONE of these two
friend Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs);
//is a 'friend' function: there is no 'this'. Has two parameters.
Sales_data operator+(const Sales_data& rhs) const;
//'this' is the left side. Has one parameter, and is const
};
至于回归,你为什么要回来?您想要返回添加了这两个内容的新Sales_data
。通常,它是这样做的:
class Sales_data {
//implement BOTH of these two
Sales_data& operator+=(const Sales_data& rhs); //plus equals
friend Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs);
};
Sales_data& Sales_data::operator+=(const Sales_data& rhs) {
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
Sales_data operator+(const Sales_data& lhs, const Sales_data& rhs) {
Sales_data result(lhs); //result is copy of lhs
result += rhs; //plus rhs
return result;
}