// SalesItem.h #ifndef __SalesItem_h__ #define __SalesItem_h__ #include using namespace std; // SalesItem starts here class SalesItem { private: string fISBN; unsigned int fUnitsSold; double fRevenue; public: // default constructor (initialization of built-in types) SalesItem() : fUnitsSold(0), fRevenue(0.0) {} SalesItem( const string& aBook ) : fISBN(aBook), fUnitsSold(0), fRevenue(0.0) {} SalesItem( istream& aIStream ) { aIStream >> *this; } // operators SalesItem& operator+=( const SalesItem& aRHS ); // friends friend bool operator==( const SalesItem& aLeft, const SalesItem& aRight ); friend istream& operator>>( istream& aIStream, SalesItem& aItem ); friend ostream& operator<<( ostream& aOStream, const SalesItem& aItem ); // read-only methods double getAveragePrice() const; bool hasSameISBN( const SalesItem& aRHS ) const; }; // operators SalesItem& SalesItem::operator+=( const SalesItem& aRHS ) { fUnitsSold += aRHS.fUnitsSold; fRevenue += aRHS.fRevenue; return *this; } // friends bool operator==( const SalesItem& aLeft, const SalesItem& aRight ) { return aLeft.fUnitsSold == aRight.fUnitsSold && aLeft.fRevenue == aRight.fRevenue && aLeft.hasSameISBN( aRight ); } istream& operator>>( istream& aIStream, SalesItem& aItem ) { double lPrice; aIStream >> aItem.fISBN >> aItem.fUnitsSold >> lPrice; // check that the inputs succeeded if ( aIStream ) { aItem.fRevenue = aItem.fUnitsSold * lPrice; } else { // reset to default state aItem = SalesItem(); } return aIStream; } ostream& operator<<( ostream& aOStream, const SalesItem& aItem ) { aOStream << aItem.fISBN << "\t" << aItem.fUnitsSold << "\t" << aItem.fRevenue << "\t" << aItem.getAveragePrice(); return aOStream; } // read-only methods double SalesItem::getAveragePrice() const { if ( fUnitsSold ) { return fRevenue / fUnitsSold; } else { return 0; } } bool SalesItem::hasSameISBN( const SalesItem& aRHS ) const { return fISBN == aRHS.fISBN; } #endif