Sales_data
ClassUltimately, we want Sales_data
to support the same set of operations as the Sales_item
class. The Sales_item
class had one member function (§ 1.5.2, p. 23), named isbn
, and supported the +
, =
, +=, <<
, and >>
operators.
We’ll learn how to define our own operators in Chapter 14. For now, we’ll define ordinary (named) functions for these operations. For reasons that we will explain in § 14.1 (p. 555), the functions that do addition and IO will not be members of Sales_data
. Instead, we’ll define those functions as ordinary functions. The function that handles compound assignment will be a member, and for reasons we’ll explain in § 7.1.5 (p. 267), our class doesn’t need to define assignment.
Thus, the interface to Sales_data
consists of the following operations:
• An isbn
member function to return the object’s ISBN
• A combine
member function to add one Sales_data
object into another
• A function named add
to add two Sales_data
objects
• A read
function to read data from an istream
into a Sales_data
object
• A print
function to print the value of a Sales_data
object on an ostream
Sales_data
ClassBefore we think about how to implement our class, let’s look at how we can use our interface functions. As one example, we can use these functions to write a version of the bookstore program from § 1.6 (p. 24) that works with Sales_data
objects rather than Sales_item
s:
Sales_data total; // variable to hold the running sum
if (read(cin, total)) { // read the first transaction
Sales_data trans; // variable to hold data for the next transaction
while(read(cin, trans)) { // read the remaining transactions
if (total.isbn() == trans.isbn()) // check the isbns
total.combine(trans); // update the running total
else {
print(cout, total) << endl; // print the results
total = trans; // process the next book
}
}
print(cout, total) << endl; // print the last transaction
} else { // there was no input
cerr << "No data?!" << endl; // notify the user
}
We start by defining a Sales_data
object to hold the running total. Inside the if
condition, we call read
to read the first transaction into total
. This condition works like other loops we’ve written that used the >>
operator. Like the >>
operator, our read
function will return its stream parameter, which the condition checks (§ 4.11.2, p. 162). If the read
fails, we fall through to the else
to print an error message.
If there are data to read, we define trans
, which we’ll use to hold each transaction. The condition in the while
also checks the stream returned by read
. So long as the input operations in read
succeed, the condition succeeds and we have another transaction to process.
Inside the while
, we call the isbn
members of total
and trans
to fetch their respective ISBNs. If total
and trans
refer to the same book, we call combine
to add the components of trans
into the running total in total
. If trans
represents a new book, we call print
to print the total for the previous book. Because print
returns a reference to its stream parameter, we can use the result of print
as the left-hand operand of the <<
. We do so to print a newline following the output generated by print
. We next assign trans
to total
, thus setting up to process the records for the next book in the file.
After we have exhausted the input, we have to remember to print the data for the last transaction, which we do in the call to print
following the while
loop.