解決《C++ Primer》第一章書店程序問題
阿新 • • 發佈:2018-09-10
argc using lin fin code rim console pri all
第一章1.6節有一個書店程序問題,按照書上的代碼,編譯器就會報錯,顯示
aa.cpp:13:32: error: no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string<char>}) ()‘ if(item1.isbn()==item2.isbn()) ^ aa.cpp:13:46: error: no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string<char>}) ()‘ if(item1.isbn()==item2.isbn()) ^
解決的辦法就是將isbn後面的調用運算符去掉,然後就編譯成功了。
缺失的頭文件Sales_item.h如下
#ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string> class Sales_item { public: Sales_item(const std::string &book):isbn(book),units_sold(0),revenue(0.0){} Sales_item(std::istream &is){ is >> *this;} friend std::istream& operator>>(std::istream &,Sales_item &); friend std::ostream& operator<<(std::ostream &,const Sales_item &); public: Sales_item & operator+=(const Sales_item&); public: double avg_price() const; bool same_isbn(const Sales_item &rhs)const { return isbn == rhs.isbn; } Sales_item():units_sold(0),revenue(0.0){} public: std::string isbn; unsigned units_sold; double revenue; }; using std::istream; using std::ostream; Sales_item operator+(const Sales_item &,const Sales_item &); inline bool operator==(const Sales_item &lhs,const Sales_item &rhs) { return lhs.units_sold == rhs.units_sold && lhs.revenue == rhs.revenue && lhs.same_isbn(rhs); } inline bool operator!=(const Sales_item &lhs,const Sales_item &rhs) { return !(lhs == rhs); } inline Sales_item & Sales_item::operator +=(const Sales_item &rhs) { units_sold += rhs.units_sold; revenue += rhs.revenue; return *this; } inline Sales_item operator+(const Sales_item &lhs,const Sales_item &rhs) { Sales_item ret(lhs); ret += rhs; return ret; } inline istream& operator>>(istream &in,Sales_item &s) { double price; in >> s.isbn >> s.units_sold >> price; if(in) s.revenue = s.units_sold * price; else s = Sales_item(); return in; } inline ostream& operator<<(ostream &out,const Sales_item &s) { out << s.isbn << "\t" <<s.units_sold << "\t" << s.revenue << "\t" << s.avg_price(); return out; } inline double Sales_item::avg_price() const { if(units_sold) return revenue/units_sold; else return 0; } #endif
程序代碼如下
#include <iostream> #include "Sales_item.h" /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char** argv) { Sales_item item1,item2;int cnt=0; if(std::cin>>item1) { cnt=1; while(std::cin>>item2) { if(item1.isbn==item2.isbn)//without the (),it runs normally { item1+=item2; cnt++; } else{ std::cout<<item1<<" occours "<<cnt<<" times " <<std::endl; item1=item2; cnt=1; } } std::cout<<item1<<" occpurs "<<cnt<<" times "<< std::endl; } }
解決《C++ Primer》第一章書店程序問題