C++primer书店程序

#include <iostream>
#include <string>
#include <cassert>
#include <algorithm>
#include <vector>
using namespace std;

class Sales_data
{
    friend std::istream& operator>>(std::istream&, Sales_data&);
    friend std::ostream& operator<<(std::ostream&, const Sales_data&);
    friend Sales_data operator+(const Sales_data&,const Sales_data&);//非成员函数(对称性)
    friend bool operator==(const Sales_data&,const Sales_data&);
    friend bool operator!=(const Sales_data&,const Sales_data&);

public:
    Sales_data():units_sold(0),revenue(0.0){}
    Sales_data(const std::string &s):bookNo(s),units_sold(0),revenue(0.0){}
    Sales_data(const std::string &s,unsigned n,double p):bookNo(s),units_sold(n),revenue(n*p){}
    Sales_data(std::istream &is);

    Sales_data& operator+=(const Sales_data&);//成员函数(复合赋值一般是成员函数)
    std::string isbn()const{return bookNo;}

    Sales_data& operator=(const std::string &s);
private:
    inline double avg_price()const;//inline
private:
    std::string bookNo; //isbn
    unsigned units_sold;//销售量
    double revenue;     //总价
};

inline double Sales_data::avg_price() const
{
    return units_sold ? revenue/units_sold : 0;
}

Sales_data::Sales_data(std::istream &is)
{
    is>>*this;
}

std::istream& operator>>(std::istream& is,Sales_data& item)
{
    double price=0.0;
    is>>item.bookNo>>item.units_sold>>price;
    if(is)//检测流的状态,输入易错且改写对象数据
        item.revenue=item.units_sold*price;
    else
        item=Sales_data();
    return is;
}

std::ostream& operator<<(std::ostream& os, const Sales_data& item)
{
    os<<item.isbn()<<" "<<item.units_sold<<" "
      <<item.revenue<<" "<<item.avg_price();
    return os;
}

Sales_data operator+(const Sales_data& item1,const Sales_data& item2)
{
    Sales_data s(item1);
    s+=item2;//调用复合赋值
    return s;
}

Sales_data& Sales_data::operator+=(const Sales_data& rhs)
{
    units_sold+=rhs.units_sold;
    revenue+=rhs.revenue;
    return *this;
}

bool operator==(const Sales_data& lhs,const Sales_data& rhs)
{
    return lhs.bookNo==rhs.bookNo &&
        lhs.units_sold==rhs.units_sold &&
        lhs.revenue==rhs.revenue;
}

bool operator!=(const Sales_data& lhs,const Sales_data& rhs)
{
    return !(lhs==rhs);
}

Sales_data& Sales_data::operator=(const std::string &s)
{
    *this=Sales_data(s);
    return *this;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-22 18:39:39

C++primer书店程序的相关文章

解决《C++ Primer》第一章书店程序问题

第一章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 s

《c++ primer》书店程序——Chapter2

Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 6 #include <string> 7 8 struct Sales_data { 9 std::string bookNo; 10 #ifdef IN_CLASS_INITS 11 unsigned units_sold = 0; 12 double revenue = 0.0; 13 #

《c++ primer》书店程序——Chapter7

Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 6 #include <string> 7 #include <iostream> 8 9 class Sales_data { 10 friend Sales_data add(const Sales_data&, const Sales_data&); 11 fr

19天学完C++Primer【1】

1.1:查阅你使用的编译器的文档,确定它所使用的文件命名约定.编译并运行第2页的main程序. 解答:跳过不影响学习. 1.2:改写程序,让它返回-1.返回值-1通常被当做程序错误的标示.重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识. 解答:跳过不影响学习. 1.3:编写程序,在标准输出上打印Hello, World. 解答: include <isotream> using namespace std; int main() { cout<<”Hello,

c++ primer plus学习笔记(栈指针)

c++ primer plus 程序清单14.5 程序清单14.6 模拟如下情况: 某人将一车文件交给plodson,如果plodson的收取蓝是空的,他将取出车中最上面的文件,将它放入收 取蓝,如果收取蓝是满的,他将取出栏中最上面的文件,并进行处理,然后放入发出蓝,如果收取蓝不空不满 plodson将采用抛硬币的方式来决定采取措施. 很明显,我们需要使用栈去管理上述文件. 1 #ifndef STACK_H_ 2 #define STACK_H_ 3 4 //定义类模板 5 template

C++中文件的读取操作,如何读取多行数据,如何一个一个的读取数据

http://blog.csdn.net/sunhero2010/article/details/50980591 练习8.1:编写函数.接受一个istream&参数,返回值类型也是istream&.此函数必须从给定流中读取数据,直至遇到文件结束标识时停止. [cpp] view plain copy #include <iostream> #include <stdexcept> using std::istream; using std::cin; using 

第 13 章

13.1 [出题思路] 理解拷贝构造函数的基本概念. [解答] 如果构造函数的第一个参数是自身类类型的引用,且所有其他参数(如果有的话)都有默认值,则此构造函数是拷贝构造函数.拷贝构造函数在以下几种情况下会被使用: 拷贝初始化(用 = 定义变量). 将一个对象作为实参传递给非引用类型的形参. 一个返回类型为非引用类型的函数返回一个对象. 用花括号列表初始化一个数组中的元素或一个聚合类中的成员. 初始化标准库容器或调用其 insert/push 操作时,容器会对其元素进行拷贝初始化. 13.2 [

【足迹C++primer】41、文本查询程序

/** * 功能:使用标准库:文本查询程序 * 时间:2014年7月10日09:10:15 * 作者:cutter_point */ #include<iostream> #include<map> #include<set> #include<fstream> #include<sstream> #include<string> #include<vector> #include<memory> using

《C++ Primer》P314中使用insert重写单词统计程序的扩展

编写程序统计并输出所读入的单词出现的次数 想与习题10-1相结合,也就是先输入几组 map<string, int>类型,存入vector中. 再输入单词word,如果已经存在则在key对应的value+1 如果不存在,则插入并使得其value为1. 之前的问题是->输入了一次之后,再要输入单词word,读不进.(呵呵 果然小白) 看到11章之后,知道要用语句cin.clear;使得输入流重新有效. 再然后 重新熟悉了iterator对map的操作. #include <iostr