文件 sales_data.h
#include <iostream>
#include <string>
using namespace std;
struct sales_data{
public:
sales_data();
sales_data(const std::string &s,unsigned n,double p);
sales_data(std::string &s);
sales_data(istream &is);
friend istream &read(istream &is,sales_data &s);
friend ostream &print(ostream &os,sales_data &s);
string isbn()const;
sales_data &combine(sales_data &);
double avg_price()const;
ostream & dis(ostream & os)const;
private:
std::string bookno;
unsigned sales_cnt ;
double revenue ;
};
文件 function.cc
#include <iostream>
#include <string>
#include "sales_data.h"
using namespace std;
sales_data::sales_data():bookno(""),sales_cnt(0),revenue(0.0){cout << "call sales_data() " << endl;}
sales_data::sales_data(const std::string &s,unsigned n,double p):bookno(s),sales_cnt(n),revenue(n * p)
{cout << "call sales_data(std::string &s,unsigned n,double p) " << endl;}
sales_data::sales_data(std::string &s):sales_data(s,0,0){cout << "call 3" <<endl;}
sales_data::sales_data(istream & is):sales_data(){read(is,*this);cout << "call 4;" << endl;}
istream &read(istream &is,sales_data &s){
double price;
cout << "Enter BookNumber/Sales counts/Price: ";
is >> s.bookno >> s.sales_cnt >> price;
s.revenue = price * s.sales_cnt;
return is;
}
ostream &print(ostream &os,sales_data &s){
os << "\n BookNumber: " << s.bookno;
os <<"\n Sales counts: " << s.sales_cnt;
os << "\n Sales revenue: " << s.revenue << endl;
}
//sales_data &add(sales_data &l,sales_data r){
// combine(l,r);
// return l;
//}
string sales_data::isbn()const{
return bookno;
}
sales_data & sales_data::combine(sales_data& s){
if(sales_data::bookno != s.isbn())
{cout << "WRONG!!! Their isbns are not equal!!!" <<endl;}
else{
sales_cnt += s.sales_cnt;
revenue += s.revenue;
}
return *this;
}
double sales_data::avg_price()const{
if (sales_cnt == 0)
return 0;
else{
return revenue/sales_cnt;
}
}
ostream & sales_data::dis(ostream &os)const{
cout << "Book Number: " << bookno <<endl;
cout << "Revenue: " << revenue <<endl;
cout << "Sales counts: "<< sales_cnt << endl;
return os;
}
sales_data & add(sales_data &l,sales_data &r){
l.combine(r);
return l;
}
文件 main.cc
#include <iostream>
#include <string>
#include "sales_data.h"
using namespace std;
int main()
{
sales_data i;
string s("12345");
i.combine(s); //立刻会报错
print(cout,i);
return 0;
}
g++编译器如下结果:
r@r-Sys:~/7.5.4/ex/2$ g++ function.cc main.cc -o 123
main.cc: In function ‘int main()’:
main.cc:9:14: error: cannot bind non-const lvalue reference of type ‘sales_data&’ to an rvalue of type ‘sales_data’
i.combine(s);
这里错误原因是,main.cc中 s是一个string对象,执行 i.combine(s)时候,s通过转换构造函数隐式类型转换为临时量sales_data,但是这个临时量不能够转换为 combine的参数类型 sales_data &