/*****************************************************
* IDE: VS2010
* FILE: Sales_data.h
*****************************************************/
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include
#include
class Sales_data
{
friend std::ostream &operator<<(std::ostream &os, const Sales_data &item);
friend std::istream &operator>>(std::istream &is, Sales_data &item);
friend bool operator==(const Sales_data &lhs, const Sales_data &rhs);
friend bool operator!=(const Sales_data &lhs, const Sales_data &rhs);
friend Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs);
public:
// constructors
Sales_data() : units_sold(0), revenue(0.0) { }
Sales_data(const std::string &s) :
book_no(s), units_sold(0), revenue(0.0) { }
Sales_data(const std::string &s, unsigned int n, double price) :
book_no(s), units_sold(n), revenue(price * n) { }
std::string isbn() const { return book_no; }
Sales_data &operator+=(const Sales_data &rhs);
private:
std::string book_no;
unsigned int units_sold;
double revenue;
// utility function
double avg_price() const;
};
#endif
/*****************************************************
* IDE: VS2010
* FILE: Sales_data.cpp
*****************************************************/
#include "Sales_data.h"
#include
using std::string;
#include
using std::istream; using std::ostream;
utility function
double Sales_data::avg_price() const
{
if (units_sold)
{
return revenue / units_sold;
}
else
{
return 0;
}
}
non-member Sales_data operations
inline ostream &operator<<(ostream &os, const Sales_data &item)
{
os << item.isbn() << " " << item.units_sold << " "
<< item.revenue << " " << item.avg_price();
return os;
}
inline istream &operator>>(istream &is, Sales_data &item)
{
double price; // no need to initialize; we'll read into price before we use it
is >> item.book_no >> item.units_sold >> price;
if (is) // check that the inputs succeeded
{
item.revenue = item.units_sold * price;
}
else // input failed: give the object the default state
{
item = Sales_data();
}
return is;
}
inline bool operator==(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() == rhs.isbn() &&
lhs.units_sold == rhs.units_sold &&
lhs.revenue == rhs.revenue;
}
inline bool operator!=(const Sales_data &lhs, const Sales_data &rhs)
{
return !(lhs == rhs);
}
// member binary operator: left-hand operand is bound to the implicit this pointer
// assumes that both objects refer to the same book
Sales_data &Sales_data::operator+=(const Sales_data &rhs)
{
units_sold += rhs.units_sold;
revenue += rhs.revenue;
return *this;
}
// assume that both objects refer to the same book
Sales_data operator+(const Sales_data &lhs, const Sales_data &rhs)
{
Sales_data sum = lhs; // copy data
sum += rhs;
return sum;
}