C ++:为具有多个参数的变量重载加法运算符

时间:2015-04-27 16:37:11

标签: c++ operator-overloading

我正在尝试重载加法运算符。我想要实现的是,当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

2 个答案:

答案 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;
}