diff options
author | Oskar <[email protected]> | 2024-07-28 12:52:38 +0200 |
---|---|---|
committer | Oskar <[email protected]> | 2024-07-28 12:52:38 +0200 |
commit | 5aac3c3f8bcfef0b2aad28d91d87b9ebf1d5e7df (patch) | |
tree | 38736b9f0c57f69e272121e0fc1f3969bb7468e2 /sales_item.hpp |
first commit
Diffstat (limited to 'sales_item.hpp')
-rw-r--r-- | sales_item.hpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/sales_item.hpp b/sales_item.hpp new file mode 100644 index 0000000..ff86669 --- /dev/null +++ b/sales_item.hpp @@ -0,0 +1,142 @@ +/* + * This file contains code from "C++ Primer, Fifth Edition", by Stanley B. + * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the + * copyright and warranty notices given in that book: + * + * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo." + * + * + * "The authors and publisher have taken care in the preparation of this book, + * but make no expressed or implied warranty of any kind and assume no + * responsibility for errors or omissions. No liability is assumed for + * incidental or consequential damages in connection with or arising out of the + * use of the information or programs contained herein." + * + * Permission is granted for this code to be used for educational purposes in + * association with the book, given proper citation if and when posted or + * reproduced.Any commercial use of this code requires the explicit written + * permission of the publisher, Addison-Wesley Professional, a division of + * Pearson Education, Inc. Send your request for permission, stating clearly + * what code you would like to use, and in what specific way, to the following + * address: + * + * Pearson Education, Inc. + * Rights and Permissions Department + * One Lake Street + * Upper Saddle River, NJ 07458 + * Fax: (201) 236-3290 +*/ + +/* This file defines the Sales_item class used in chapter 1. + * The code used in this file will be explained in + * Chapter 7 (Classes) and Chapter 14 (Overloaded Operators) + * Readers shouldn't try to understand the code in this file + * until they have read those chapters. +*/ + +#ifndef SALESITEM_H +// we're here only if SALESITEM_H has not yet been defined +#define SALESITEM_H + +// Definition of Sales_item class and related functions goes here +#include <iostream> +#include <string> + +class Sales_item { +// these declarations are explained section 7.2.1, p. 270 +// and in chapter 14, pages 557, 558, 561 +friend std::istream& operator>>(std::istream&, Sales_item&); +friend std::ostream& operator<<(std::ostream&, const Sales_item&); +friend bool operator<(const Sales_item&, const Sales_item&); +friend bool +operator==(const Sales_item&, const Sales_item&); +public: + // constructors are explained in section 7.1.4, pages 262 - 265 + // default constructor needed to initialize members of built-in type + Sales_item() = default; + Sales_item(const std::string &book): bookNo(book) { } + Sales_item(std::istream &is) { is >> *this; } +public: + // operations on Sales_item objects + // member binary operator: left-hand operand bound to implicit this pointer + Sales_item& operator+=(const Sales_item&); + + // operations on Sales_item objects + std::string isbn() const { return bookNo; } + double avg_price() const; +// private members as before +private: + std::string bookNo; // implicitly initialized to the empty string + unsigned units_sold = 0; // explicitly initialized + double revenue = 0.0; +}; + +// used in chapter 10 +inline +bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs) +{ return lhs.isbn() == rhs.isbn(); } + +// nonmember binary operator: must declare a parameter for each operand +Sales_item operator+(const Sales_item&, const Sales_item&); + +inline bool +operator==(const Sales_item &lhs, const Sales_item &rhs) +{ + // must be made a friend of Sales_item + return lhs.units_sold == rhs.units_sold && + lhs.revenue == rhs.revenue && + lhs.isbn() == rhs.isbn(); +} + +inline bool +operator!=(const Sales_item &lhs, const Sales_item &rhs) +{ + return !(lhs == rhs); // != defined in terms of operator== +} + +// assumes that both objects refer to the same ISBN +Sales_item& Sales_item::operator+=(const Sales_item& rhs) +{ + units_sold += rhs.units_sold; + revenue += rhs.revenue; + return *this; +} + +// assumes that both objects refer to the same ISBN +Sales_item +operator+(const Sales_item& lhs, const Sales_item& rhs) +{ + Sales_item ret(lhs); // copy (|lhs|) into a local object that we'll return + ret += rhs; // add in the contents of (|rhs|) + return ret; // return (|ret|) by value +} + +std::istream& +operator>>(std::istream& in, Sales_item& s) +{ + double price; + in >> s.bookNo >> s.units_sold >> price; + // check that the inputs succeeded + if (in) + s.revenue = s.units_sold * price; + else + s = Sales_item(); // input failed: reset object to default state + return in; +} + +std::ostream& +operator<<(std::ostream& out, const Sales_item& s) +{ + out << s.isbn() << " " << s.units_sold << " " + << s.revenue << " " << s.avg_price(); + return out; +} + +double Sales_item::avg_price() const +{ + if (units_sold) + return revenue/units_sold; + else + return 0; +} +#endif |