【问题标题】:C++: Overloading addition operator for a variable that has multiple argumentsC ++:为具有多个参数的变量重载加法运算符
【发布时间】:2015-04-27 16:37:10
【问题描述】:

我正在尝试重载加法运算符。我想要实现的是,当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 &amp; Sales_data::operator+,但这会产生同样的错误。

如何正确地为Sales_data 重载operator+

【问题讨论】:

  • operator+ 只对两个项目进行操作:x + yx 添加到 y,并产生一个结果。如果您需要在结果中表示两件事,则需要返回包含您关心的两个项目的单个项目(例如,struct)。
  • @JerryCoffin 我不明白/不知道我将如何做到这一点,或者我应该搜索哪些术语以查看相关示例。

标签: c++ operator-overloading


【解决方案1】:

错误信息在这种情况下很有帮助:

error: ‘Sales_data Sales_data::operator+(const
Sales_data&, const Sales_data&)’ must take either zero or one argument
                                    & data2) {

有两个operator+s:一元的(即+x)和二元的(即a + b)。 member 运算符的重载版本分别采用零和一个参数 - 而您编写的定义采用两个参数。那就是错误:这是一个无效的签名。

我猜你真的打算写一个普通的非成员二进制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};
}

作为 member 运算符,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};
}

【讨论】:

  • 您的答案和 Mooing Duck 的答案都不能单独起作用;但是,使用两个答案中设置的不同部分确实有效。
【解决方案2】:

首先:有两种方法可以声明二进制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;
}

【讨论】:

  • 您的答案或巴里的答案都不能单独起作用;但是,使用您两个答案中设置的不同部分确实有效。
  • @dustin:我们的答案都是完整的。很可能您犯了错字或疏忽。
猜你喜欢
  • 1970-01-01
  • 2010-12-28
  • 2022-01-19
  • 2011-01-24
  • 1970-01-01
  • 2018-06-15
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多