C++Primer1.5.1AddingSales_items

 1 // 1/add_item.cc
 2 #include <iostream>
 3 #include "Sales_item.h"
 4
 5 int main(int argc, char** argv)
 6 {
 7     Sales_item item1;
 8     Sales_item item2;
 9
10     std::cin >> item1 >> item2;              // read a pair of transactions
11     std::cout << item1 + item2 << std::endl; // print their sum
12
13     return 0;
14 }
  1 // 1/Sales_item.h
  2 /* This file defines the Sales_item class used in chapter 1.
  3  * The code used in this file will be explained in
  4  * Chapter 7 (Classes) and Chapter 14 (Overloaded Operators)
  5  * Readers shouldn‘t try to understand the code in this file
  6  * until they have read those chapters.
  7 */
  8
  9 #ifndef SALESITEM_H
 10 // we‘re here only if SALESITEM_H has not yet been defined
 11 #define SALESITEM_H
 12
 13 // Definition of Sales_item class and related functions goes here
 14 #include <iostream>
 15 #include <string>
 16
 17 class Sales_item {
 18 // these declarations are explained section 7.2.1, p. 270
 19 // and in chapter 14, pages 557, 558, 561
 20 friend std::istream& operator>>(std::istream&, Sales_item&);
 21 friend std::ostream& operator<<(std::ostream&, const Sales_item&);
 22 friend bool operator<(const Sales_item&, const Sales_item&);
 23 friend bool operator==(const Sales_item&, const Sales_item&);
 24 public:
 25     // constructors are explained in section 7.1.4, pages 262 - 265
 26     // default constructor needed to initialize members of built-in type
 27     Sales_item() = default;
 28     Sales_item(const std::string &book): bookNo(book) { }
 29     Sales_item(std::istream &is) { is >> *this; }
 30 public:
 31     // operations on Sales_item objects
 32     // member binary operator: left-hand operand bound to implicit this pointer
 33     Sales_item& operator+=(const Sales_item&);
 34
 35     // operations on Sales_item objects
 36     std::string isbn() const { return bookNo; }
 37     double avg_price() const;
 38 // private members as before
 39 private:
 40     std::string bookNo;      // implicitly initialized to the empty string
 41     unsigned units_sold = 0; // explicitly initialized
 42     double revenue = 0.0;
 43 };
 44
 45 // used in chapter 10
 46 inline
 47 bool compareIsbn(const Sales_item &lhs, const Sales_item &rhs)
 48 { return lhs.isbn() == rhs.isbn(); }
 49 // nonmember binary operator: must declare a parameter for each operand
 50 Sales_item operator+(const Sales_item&, const Sales_item&);
 51
 52 inline bool operator==(const Sales_item &lhs, const Sales_item &rhs)
 53 {
 54     // must be made a friend of Sales_item
 55     return lhs.units_sold == rhs.units_sold &&
 56            lhs.revenue == rhs.revenue &&
 57            lhs.isbn() == rhs.isbn();
 58 }
 59
 60 inline bool operator!=(const Sales_item &lhs, const Sales_item &rhs)
 61 {
 62     return !(lhs == rhs); // != defined in terms of operator==
 63 }
 64
 65 // assumes that both objects refer to the same ISBN
 66 Sales_item& Sales_item::operator+=(const Sales_item& rhs)
 67 {
 68     units_sold += rhs.units_sold;
 69     revenue += rhs.revenue;
 70     return *this;
 71 }
 72
 73 // assumes that both objects refer to the same ISBN
 74 Sales_item operator+(const Sales_item& lhs, const Sales_item& rhs)
 75 {
 76     Sales_item ret(lhs);  // copy (|lhs|) into a local object that we‘ll return
 77     ret += rhs;           // add in the contents of (|rhs|)
 78     return ret;           // return (|ret|) by value
 79 }
 80
 81 std::istream& operator>>(std::istream& in, Sales_item& s)
 82 {
 83     double price;
 84     in >> s.bookNo >> s.units_sold >> price;
 85     // check that the inputs succeeded
 86     if (in)
 87         s.revenue = s.units_sold * price;
 88     else
 89         s = Sales_item();  // input failed: reset object to default state
 90     return in;
 91 }
 92
 93 std::ostream& operator<<(std::ostream& out, const Sales_item& s)
 94 {
 95     out << s.isbn() << " " << s.units_sold << " "
 96         << s.revenue << " " << s.avg_price();
 97     return out;
 98 }
 99
100 double Sales_item::avg_price() const
101 {
102     if (units_sold)
103         return revenue/units_sold;
104     else
105         return 0;
106 }
107
108 #endif
1 AddItem: add_item.cc
2 >---g++ -g -Wall -std=c++0x add_item.cc -o AddItem
3 clean:
4 >---rm AddItem
时间: 2024-10-06 00:58:13

C++Primer1.5.1AddingSales_items的相关文章

R语言S3类的理解与构建

R语言类 R语言的类有S3类和S4类,S3类用的比较广,创建简单粗糙但是灵活,而S4类比较精细,具有跟C++一样严格的结构.这里我们主要讲S3类. S3类的结构 S3类内部是一个list,append某个list类名称,就能成为该类.list里面的内容就是我们所说的属性. 首先创建一个list me <- list(seq = "ATGC", length = nchar("ATGC")) me $seq [1] "ATGC" $lengt