2015-04-27 49 views
-2

我想重載加法運算符。我試圖實現的是,當item1 + item2加在一起時,units_sold的數量增加並增加了收入。在這個例子中,我假設ISBN是相同的條目。我沒有在下面的代碼中顯示檢查這個,但我在實際的代碼中這樣做。也就是說,ISBN不會添加,但在輸出中保持不變。C++:爲具有多個參數的變量重載加法運算符

問題代碼:

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

運算符+對兩個項目進行操作:'x + y'將'x'加到'y',併產生一個結果。如果您需要在結果中表示兩件事情,則需要返回包含您關心的兩個項目的單個項目(例如'struct')。 –

+0

@JerryCoffin我不明白/知道我會如何完成或者我應該搜索哪些術語來查看相關示例。 – dustin

回答

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)。 成員這些運算符重載版本分別取零和一個參數 - 而您編寫的定義需要兩個參數。這是錯誤的:這是一個無效的簽名。

我猜你真的打算寫一個正常的非成員二進制文件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}; 
} 
+0

您的答案或Mooing Duck的答案都不能獨立工作;然而,從你的兩個答案中使用設置的不同部分確實有效。 – dustin

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

至於ret甕,你爲什麼要回來?你想返回一個新的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; 
} 
+0

你的答案或巴里的答案都不能單獨工作;然而,從你的兩個答案中使用設置的不同部分確實有效。 – dustin

+1

@dustin:我們的答案都是完整的。很可能你犯了錯誤或疏忽。 –