So as you can see I would like to make the read function known to the class, as I`m using it in a constructor in the class, it`s an exercise so I would not like to define it outside the class, does anyone how I can achieve this? because read uses a Sales_data type before it is defined
#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <iostream>
#include <string>
std::istream &read(std::istream &, Sales_data &);
struct Sales_data {
Sales_data() = default;
Sales_data(const std::string &s) : bookNo(s) {}
Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue (p*n) {}
Sales_data(std::istream &is)
{
read(is, *this);
}
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
}
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
elsereturn 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