1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
class Sales_data; // declaration for the following class
std::istream &read(std::istream &, Sales_data &); // declaration for read, used inside the class
class Sales_data {
public:
friend std::istream &read(std::istream &, Sales_data &);
friend std::ostream &print(std::ostream &, const Sales_data &);
friend Sales_data add(const Sales_data &, const Sales_data &);
// CONSTRUCTORS
Sales_data() = default; // needed
Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue (p*n) {std::cout << "1" << std::endl;} // if we get a string, unsigned and a double then initialize the members of the class
Sales_data(const std::string &s) : Sales_data(s, 0, 0) {std::cout << "2" << std::endl;} // if we just get a string as a initializer then assign that to bookNo
Sales_data(unsigned n, double p) : Sales_data("", n, p) {std::cout << "3" << std::endl;}
Sales_data(std::istream &is) // if we get an istream
{
read(is, *this); // call read to assign the current object
}
std::string isbn() const // funtion to call for the ISBN of the current book
{
return bookNo; // return the book numbers
}
Sales_data& combine (const Sales_data&rhs) // to combine two Objects of Sales_data
{
units_sold += rhs.units_sold; // add the amount of books sold
revenue += rhs.revenue; // for adding the revenue
return *this; // return the object that the funtion was called on
}
private:
inline double avg_price() const // for calculating the average price
{
if (units_sold)
return revenue/units_sold; // return: devide revenue by the amount of units sold
else
return 0; // else return nothing
}
std::string bookNo; // for holding our book number/ISBN
unsigned units_sold = 0; // for holding the amount of books sold
double revenue = 0.0; // for holding the price they were sold at
};
std::istream &read(std::istream &is, Sales_data &item) // funtion for getting input into a Sales_data object
{
double price = 0; // for getting our price that the objects were sold at
is >> item.bookNo >> item.units_sold >> price; // get input
item.revenue = price * item.units_sold; // calculate the revenue
return is;
}
std::ostream &print(std::ostream &os, const Sales_data &item) // funtion for output
{
os << item.isbn() << " " << item.units_sold << " " << item.revenue << " " << item.avg_price(); // print out values
return os; // return the output stream
}
Sales_data add(const Sales_data &lhs, const Sales_data &rhs) // for adding to Sales_data objects
{
Sales_data sum = lhs; // sum for returning
sum.combine(rhs); // combine sum with rhs
return sum; // return the combined object
}
#endif // SALES_DATA_H
|