C++ Primer(第5版) 练习 16.3
练习 16.3 对两个Sales_data对象调用你的compare函数,观察编译器在实例化过程中如何处理错误。
环境:Linux Ubuntu(云服务器)
工具:vim
解释
/*************************************************************************
> File Name: ex16.3.cpp
> Author:
> Mail:
> Created Time: Tue 30 Jul 2024 08:13:05 AM CST
************************************************************************/
#include<iostream>
using namespace std;
struct Sales_data{
Sales_data(const string &s, unsigned n, double p):
bookNo(s), units_sold(n), price(p), revenue(p * n) {}
Sales_data(): Sales_data("", 0, 0) {}
Sales_data(string s): Sales_data(s, 0, 0) {}
friend istream &operator>>(istream &, Sales_data &);
friend ostream &operator<<(ostream &, const Sales_data &);
Sales_data& operator+= (Sales_data &);
string isbn() const;
Sales_data& combine(const Sales_data&);
double avg_price() const;
string bookNo;
unsigned units_sold = 0;
double price = 0.0;
double revenue = 0.0;
};
string Sales_data::isbn() const{
return this->bookNo;
}
Sales_data& Sales_data::combine(const Sales_data &rhs){
units_sold += rhs.units_sold;
revenue += rhs.revenue;
price = rhs.price;
bookNo = rhs.bookNo;
return *this;
}
double Sales_data::avg_price() const{
if(units_sold){
return revenue / units_sold;
}
else{
return 0;
}
}
Sales_data& Sales_data::operator+= (Sales_data &sd){
this->combine(sd);
return *this;
}
ostream &operator<<(ostream &output, const Sales_data &sd){
output<<sd.bookNo<<" "<<sd.units_sold<<" "<<sd.price<<" "<<sd.revenue<<" "<<sd.avg_price()<<endl;
return output;
}
istream &operator>>(istream &input, Sales_data &sd){
input>>sd.bookNo>>sd.units_sold>>sd.price;
sd.revenue = sd.price * sd.units_sold;
return input;
}
template <typename T>
int compare(const T &a, const T &b){
return a >= b ? a == b ? 0 : 1 : -1;
}
int main(){
Sales_data book1("0-101-12335-X", 2, 10.0);
Sales_data book2("1-103-23344-Y", 3, 15.0);
cout<<compare(book1, book2)<<endl;
return 0;
}