Encapsulation. Contents. Steven Zeil. July 17, Encapsulation Encapsulation in C Classes 4. 3 Hiding Attributes 8

Similar documents
Operator Overloading

Operator Overloading

Unit Testing. Contents. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

Unit Testing. Steven Zeil. July 22, Types of Testing 2. 2 Unit Testing Scaffolding Drivers Stubs...

Copying Data. Contents. Steven J. Zeil. November 13, Destructors 2

The Structure of a C++ Program

Defensive Programming

Common Modifications of Class Members

Common Modifications of Class Members

Common Modifications of Class Members

The Structure of a C++ Program

Computer Programming with C++ (21)

Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 4

Linked Lists. Contents. Steven J. Zeil. July 31, Linked Lists: the Basics 3

Patterns: Working with Arrays

A Deeper Look at Classes

Pointers and References

CS 1337 Computer Science II Page 1

1 // Fig. 6.13: time2.cpp 2 // Member-function definitions for class Time. 3 #include <iostream> Outline. 4 5 using std::cout; 6 7 #include <iomanip>

Classes: A Deeper Look, Part 2

! Data is stored in variables. - Perhaps using arrays and structs. ! Program is a collection of functions that perform

! Data is stored in variables. - Perhaps using arrays and structs. ! Program is a collection of functions that perform

W8.1 Continuing Classes friend Functions and friend Classes Using the this Pointer Cascading Function Calls

! Data is stored in variables. - Perhaps using arrays and structs. ! Program is a collection of functions that perform

! Data is stored in variables. - Perhaps using arrays and structs. ! Program is a collection of functions that perform

! Data is stored in variables. - Perhaps using arrays and structs. ! Program is a collection of functions that perform

Lecture 7. Log into Linux New documents posted to course webpage

CSCE 110 PROGRAMMING FUNDAMENTALS

OBJECT ORIENTED PROGRAMMING USING C++

l A class in C++ is similar to a structure. - It allows you to define a new (composite) data type. l A class contains the following: - variables AND

III. Classes (Chap. 3)

Software Design Abstract Data Types

10/23/02 21:20:33 IO_Examples

Operator Overloading in C++ Systems Programming

I/O Streams and Standard I/O Devices (cont d.)

COMP322 - Introduction to C++ Lecture 02 - Basics of C++

Inheritance and Polymorphism

l A class in C++ is similar to a structure. - It allows you to define a new (composite) data type. l A class contains the following: - variables AND

2. It is possible for a structure variable to be a member of another structure variable.

C C C C++ 2 ( ) C C++ 4 C C

CSI33 Data Structures

Computer Programming Class Members 9 th Lecture

A C++ Class Designer s Checklist

Classes: A Deeper Look. Systems Programming

CS24 Week 3 Lecture 1

Pointer Assignments. CISC181 Introduction to Computer Science. Dr. McCoy. Lecture 18 October 29, The new Operator

Due Date: See Blackboard

Lab: Supplying Inputs to Programs

IV. Stacks. A. Introduction 1. Consider the 4 problems on pp (1) Model the discard pile in a card game. (2) Model a railroad switching yard

What will happen if we try to compile, link and run this program? Do you have any comments to the code?

Introduction to Programming session 24

Unified Modeling Language a case study

typedef Labeling<unsigned char,short> LabelingBS; typedef Labeling<unsigned char,short>::regioninfo RegionInfoBS;

The Class. Classes and Objects. Example class: Time class declaration with functions defined inline. Using Time class in a driver.

Angela Chih-Wei Tang Visual Communications Lab Department of Communication Engineering National Central University JhongLi, Taiwan.

Linked List using a Sentinel

Abstract Data Types (ADTs) 1. Legal Values. Client Code for Rational ADT. ADT Design. CS 247: Software Engineering Principles

Classes and Data Abstraction. Topic 5

Assignment 2 Solution

Practice Problems CS2620 Advanced Programming, Spring 2003

CS 247: Software Engineering Principles. ADT Design

COMP322 - Introduction to C++

Chapter 6: Classes and Data Abstraction

Chapter 17 - C++ Classes: Part II

Chapter 2. Procedural Programming

Streams. Ali Malik

Jordan University of Science & Technology Department of Computer Science CS 211 Exam #1 (23/10/2010) -- Form A

G52CPP C++ Programming Lecture 9

Expert Systems artificial intelligence

Exceptions, Case Study-Exception handling in C++.

The American University in Cairo Computer Science & Engineering Department CSCE Dr. KHALIL Exam II Spring 2010

Agenda. The main body and cout. Fundamental data types. Declarations and definitions. Control structures

Lab 6 Due Date: Wednesday, April 5, /usr/local/3302/include/direct linking loader.h Driver File:

EECE.3220: Data Structures Spring 2017

Introduction & Review

Fig. 7.1 Fig. 7.2 Fig. 7.3 Fig. 7.4 Fig. 7.5 Fig. 7.6 Fig. 7.7 Fig. 7.8 Fig. 7.9 Fig. 7.10

! A class in C++ is similar to a structure. ! A class contains members: - variables AND. - public: accessible outside the class.

57:017, Computers in Engineering C++ Classes

Preview 11/1/2017. Constant Objects and Member Functions. Constant Objects and Member Functions. Constant Objects and Member Functions

Lecture 5 Files and Streams

More Group HW. #ifndef Stackh #define Stackh. #include <cstdlib> using namespace std;

pointers & references

Chapter 18 - C++ Operator Overloading

Trees. Contents. Steven J. Zeil. August 3, Tree Terminology 2. 2 Tree Traversal Recursive Traversals... 4

CSCE 110 PROGRAMMING FUNDAMENTALS

Computer Programming. Basic Control Flow - Loops. Adapted from C++ for Everyone and Big C++ by Cay Horstmann, John Wiley & Sons

Strings and Streams. Professor Hugh C. Lauer CS-2303, System Programming Concepts

! A class in C++ is similar to a structure. ! A class contains members: - variables AND. - public: accessible outside the class.

class Polynomial { public: Polynomial(const string& N = "no name", const vector<int>& C = vector<int>());... };

Week 3: File I/O and Formatting 3.7 Formatting Output

CPSC 427: Object-Oriented Programming

l A class in C++ is similar to a structure. l A class contains members: - variables AND - public: accessible outside the class.

Object Oriented Programming COP3330 / CGS5409

CE221 Programming in C++ Part 1 Introduction

More C++ Classes. Systems Programming

Recursion. Contents. Steven Zeil. November 25, Recursion 2. 2 Example: Compressing a Picture 4. 3 Example: Calculator 5

IS 0020 Program Design and Software Tools

COMP322 - Introduction to C++

Ch. 11: References & the Copy-Constructor. - continued -

Introduction to the C programming language

Transcription:

Steven Zeil July 17, 2013 Contents 1 Encapsulation 2 1.1 Encapsulation in C++........................................................ 2 2 Classes 4 3 Hiding Attributes 8 4 Inline Functions 11 4.1 How Functions Work........................................................ 11 4.2 How Function Calls Work..................................................... 15 4.3 Inline Functions........................................................... 17 5 Example: the Auction Program as Encapsulated ADTs 20 1

1 Encapsulation The ADT as Contract When an ADT specification/implementation is provided to users (application programmers): Users are expected to alter/examine values of this type only via the members specified. The creator of the ADT promises to leave the member specifications unchanged.............................................. Enforcing the Contract If we leave it like this(13), then the contract is just a "gentlemen s agreement". Programmers in older programming languages do just that. But programming language designers eventually noticed. Encapsulation is the use of programming language rules to enforce information hiding design decisions.............................................. 1.1 Encapsulation in C++ Encapsulation in C++ We can mark portions of a struct as public, meaning that names declared there can be used by any code. private, meaning that names declared there can only be used by code that is part of the struct.............................................. CS333 2

Time for Encapsulation struct Time public: // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes int gethours(); int getminutes(); int getseconds(); // Calculations with time void add (Time delta); Time difference (Time fromtime); * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void read (std::istream& in); * Print a time in the format HH:MM:SS (two digits each) void print (std::ostream& out); * Compare two times. Return true iff time1 is earlier than or equal to CS333 3

* time2 bool nolaterthan(const Time& time2); * Compare two times. Return true iff time1 is equal to * time2 * bool equalto(const Time& time2); private: // From here on is hidden int secondssincemidnight; ; int Time : : gethours ( ) return secondssincemidnight / 3600; / / OK int gethours (Time t ) return t. secondssincemidnight / 3600; / / Error............................................. 2 Classes From structs to classes CS333 4

Most ADTs in C++ are written as classes, not structs. Almost identical, according to language rules Until you explicitly say "public:" or "private:", Structs start out as "public" Classes start out as "private" Very different in style/idiom Classes are used for "real" ADTs that the application coders will work with. Structs are used for "helper" types that the classes uses to get their work done * often nested inside classes or for such trivial structured data that no information hiding is necessary............................................. Showing a Little Class Our time class: class Time public: // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes int gethours(); int getminutes(); int getseconds(); CS333 5

// Calculations with time void add (Time delta); Time difference (Time fromtime); * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void read (std::istream& in); * Print a time in the format HH:MM:SS (two digits each) void print (std::ostream& out); * Compare two times. Return true iff time1 is earlier than or equal to * time2 bool nolaterthan(const Time& time2); * Compare two times. Return true iff time1 is equal to * time2 * bool equalto(const Time& time2); private: CS333 6

// From here on is hidden int secondssincemidnight; ; And our alternate version of the same class: class Time // The declaration below is hidden int secondssincemidnight; public: // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes int gethours(); int getminutes(); int getseconds(); // Calculations with time void add (Time delta); Time difference (Time fromtime); * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void read (std::istream& in); * Print a time in the format HH:MM:SS (two digits each) CS333 7

void print (std::ostream& out); * Compare two times. Return true iff time1 is earlier than or equal to * time2 bool nolaterthan(const Time& time2); * Compare two times. Return true iff time1 is equal to * time2 * bool equalto(const Time& time2); ;............................................. 3 Hiding Attributes Hide Your Attributes An almost universal rule of thumb for ADTs in C++: All data members should be private. Attributes are data values that we regard as "contained" in our abstraction They are part of the mental model, must be part of the interface If a data member represents an attribute, can we hide it? CS333 8

Yes, but we provide access via get/set functions.............................................. Example: Time Attributes class Time public: // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes int gethours(); void sethours (int h); int getminutes(); void setminutes (int m); int getseconds(); void setseconds (int s); // Calculations with time void add (Time delta); Time difference (Time fromtime); * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void read (std::istream& in); CS333 9

* Print a time in the format HH:MM:SS (two digits each) void print (std::ostream& out); * Compare two times. Return true iff time1 is earlier than or equal to * time2 bool nolaterthan(const Time& time2); * Compare two times. Return true iff time1 is equal to * time2 * bool equalto(const Time& time2); private: // From here on is hidden int hours; int minutes; int seconds; ; int Time : : gethours ( ) return hours ; CS333 10

void Time : : sethours ( int h) hours = h ;............................................. 4 Inline Functions Are Short Functions Ineffcient? Are ADT implementations terribly inefficient? They tend to feature a lot of one-liners and similar short functions. int Time : : gethours ( ) return hours ;............................................. 4.1 How Functions Work How Functions Work int foo ( int a, int b) return a+b 1; would compile into a block of code equivalent to stack [ 1 ] = stack [ 3 ] + stack [ 2 ] 1 ; jump to address in stack [ 0 ]............................................. CS333 11

The Runtime Stack the stack is the runtime stack (a.k.a. the activation stack) used to track function calls at the system level, stack[0] is the top value on the stack, stack[1] the value just under that one, and so on.............................................. An Example of Function Activation Suppose that we were executing this code, and had just come to the call to resolveauction within main. #include " time. h" void resolveauction ( Item item ). int h = item. auctionendsat. gethours ( ) ;. int main ( int argc, char ** argv ). resolveauction ( item ) ;. CS333 12

The runtime stack (a.ka., the activation stack) would, at this point in time, contain a single activation record for the main function, as that is the only function currently executing: When main calls resolveauction, a new record is added to the stack with space for all the data required for this new function call. CS333 13

When resolveauction calls gethours, another new record is added to the stack with space for all the data required for that new function call. CS333 14

But once gethours returns (to resolveauction), that activation record is removed from the stack. resolveauction is once again the active function. And when resolveauction returns, its record is likewise removed from the stack.............................................. 4.2 How Function Calls Work How Function Calls Work CS333 15

A function call like x = foo ( y, z + 1 ) ; would be compiled into a code sequence along the lines of push y onto the runtime stack ; evaluate z +1; push the r e s u l t onto the runtime stack push ( space for the return value ) onto the runtime stack save a l l CPU r e g i s t e r s push address RET onto the runtime stack jump to s t a r t of foo s body RET : x = stack [ 1 ] pop runtime stack 4 times restore a l l CPU r e g i s t e r s As you can see, there s a fair amount of overhead involved in passing parameters and return address information to a function when making a call. The amount of time spent on this overhead is really all that large. If the function body contains several statements of any kind of loop, then the overhead is probably a negligable fraction of the total time spent on the call. Overhead int Time : : gethours ( ) return hours ; void Time : : sethours ( int h) hours = h ; CS333 16

For functions like these, the overhead may be greater than the time needed for the function body itself If called inside a loop that repeats many times, delay can be significant............................................. 4.3 Inline Functions Inline Functions class Time public: // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes int gethours() return hours; void sethours (int h) hours = h; int getminutes(); void setminutes (int m);. private: int hours; int minutes; int seconds; ; inline int Time::getMinutes() CS333 17

return minutes; inline void Time::setMinutes(int m) minutes = m; C++ offers the option of declaring functions as inline. can be written one of two ways. * inside the class declaration. * or place the reserved word inline in front of the function definition written outside the class declaration.............................................. How Inline Functions Work When we make a call to an inline function, the compiler simply replaces the call by a compiled copy of the function body (with some appropriate renaming of variables to avoid conflicts).............................................. Example of an Inline Call If we have inline int foo ( int a, int b) return a+b 1; CS333 18

and we later make a call x = foo ( y, z + 1 ) ; This would be compiled into a code sequence along the lines of evaluate z+1, storing r e s u l t in tempb evaluate y + tempb 1, storing r e s u l t in x Most of the overhead of making a function call has been eliminated.............................................. Use Inline For Functions That Are... short called many times If abused, inline calls tend to make the size of the executable program grow.............................................. Inlining is Optional Inlining is only a recommendation from the programmer to the compiler. The compiler may ignore an inline declaration if it prefers. inlining of functions with recursive calls is impossible Many compilers will refuse to inline any function whose body contains a loop.............................................. CS333 19

5 Example: the Auction Program as Encapsulated ADTs The Auction Program #include <iostream> #include <string> using namespace std; #include "items.h" #include "itemcollection.h" #include "bidders.h" #include "biddercollection.h" #include "bids.h" #include "bidcollection.h" #include "time.h" const int MaxBidders = 100; const int MaxBids = 5000; const int MaxItems = 100; * Determine the winner of the auction for item #i. * Announce the winner and remove money from winner s account. void resolveauction (const Item& item, BidderCollection& bidders, BidCollection& bids); CS333 20

int main (int argc, char** argv) if (argc!= 4) cerr << "Usage: " << argv[0] << " itemsfile biddersfile bidsfile" << endl; return -1; ItemCollection items (MaxItems); items.readitems (argv[1]); BidderCollection bidders (MaxBidders); bidders.readbidders (argv[2]); BidCollection bids (MaxBids); bids.readbids (argv[3]); for (int i = 0; i < items.getsize(); ++i) resolveauction(items.get(i), bidders, bids); return 0; * Determine the winner of the auction for an item. * Announce the winner and remove money from winner s account. void resolveauction (const Item& item, BidderCollection& bidders, CS333 21

BidCollection& bids) double highestbidsofar = 0.0; string winningbiddersofar; bool reservepricemet = false; for (int bidnum = 0; bidnum < bids.getsize(); ++bidnum) Bid bid = bids.get(bidnum); if (bid.gettimeplacedat().nolaterthan(item.getauctionendtime())) if (bid.getitem() == item.getname() && bid.getamount() > highestbidsofar ) int biddernum = bidders.findbidder(bid.getbidder()); Bidder bidder = bidders.get(biddernum); // Can this bidder afford it? if (bid.getamount() <= bidder.getbalance()) highestbidsofar = bid.getamount(); winningbiddersofar = bid.getbidder(); if (bid.getamount() > item.getreservedprice()) reservepricemet = true; // If highestbidsofar is non-zero, we have a winner if (reservepricemet && highestbidsofar > 0.0) CS333 22

int biddernum = bidders.findbidder(winningbiddersofar); cout << item.getname() << " won by " << winningbiddersofar << " for " << highestbidsofar << endl; Bidder& bidder = bidders.get(biddernum); bidder.setbalance (bidder.getbalance() - highestbidsofar); else cout << item.getname() << " reserve not met" << endl; The Bid ADT: #ifndef BIDS_H #define BIDS_H #include <string> #include "time.h" // // Bids Received During Auction // class Bid CS333 23

std::string biddername; double amount; std::string itemname; Time bidplacedat; public: Bid (std::string bidder, double amt, std::string item, Time placedat); Bid(); // Access to attribute std::string getbidder() const return biddername; double getamount() const return amount; std::string getitem() const return itemname; Time gettimeplacedat() const return bidplacedat; ; #endif and #include <string> #include <fstream> CS333 24

using namespace std; // // Bids Received During Auction // #include "bids.h" Bid::Bid (std::string bidder, double amt, std::string item, Time placedat) : biddername(bidder), amount(amt), itemname(item), bidplacedat(placedat) Bid::Bid () : amount(0.0) The Bidder ADT: #ifndef BIDDERS_H #define BIDDERS_H #include <string> // // Bidders Registered for auction // CS333 25

class Bidder // describes someone registered to participate in an auction std::string name; double balance; public: Bidder(); Bidder (std::string thename, double thebalance); // Access to attributes std::string getname() const return name; double getbalance() const return balance; void setbalance (double newbal) balance = newbal; ; #endif and #include <string> #include <fstream> #include <iostream> // // Bidders Registered for auction // CS333 26

#include "bidders.h" using namespace std; Bidder::Bidder() name = ""; balance = 0.0; Bidder::Bidder (std::string thename, double thebalance) name = thename; balance = thebalance; The Item ADT: #ifndef ITEMS_H #define ITEMS_H #include <iostream> #include <string> #include "time.h" // // Items up for auction // CS333 27

class Item std::string name; double reservedprice; Time auctionendsat; public: Item(); Item (std::string itemname, double reserve, Time auctionend); // Access to attribute std::string getname() const return name; double getreservedprice() const return reservedprice; Time getauctionendtime() const return auctionendsat; * Read one item from the indicated file void read (std::istream& in); ; #endif and CS333 28

#include <iostream> #include <fstream> #include "items.h" // // Items up for auction // using namespace std; Item::Item() : reservedprice(0.0) Item::Item (std::string itemname, double reserve, Time auctionend) : name(itemname), reservedprice(reserve), auctionendsat(auctionend) * Read one item from the indicated file void Item::read (istream& in) in >> reservedprice; CS333 29

auctionendsat.read (in); // Reading the item name. char c; in >> c; // Skips blanks and reads first character of the name string line; getline (in, line); // Read the rest of the line name = string(1,c) + line; The Time ADT: #ifndef TIMES_H #define TIMES_H #include <iostream> * Times in this program are represented by three integers: H, M, & S, representing * the hours, minutes, and seconds, respecitvely. struct Time // Create time objects Time(); // midnight Time (int h, int m, int s); // Access to attributes CS333 30

int gethours() const; int getminutes() const; int getseconds() const; // Calculations with time void add (Time delta); Time difference (Time fromtime); * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void read (std::istream& in); * Print a time in the format HH:MM:SS (two digits each) void print (std::ostream& out) const; * Compare two times. Return true iff time1 is earlier than or equal to * time2 bool nolaterthan(const Time& time2); * Compare two times. Return true iff time1 is equal to * time2 * CS333 31

bool equalto(const Time& time2); // From here on is hidden int secondssincemidnight; ; #endif // TIMES_H and #include "time.h" #include <iomanip> using namespace std; * Times in this program are represented by three integers: H, M, & S, representing * the hours, minutes, and seconds, respecitvely. // Create time objects Time::Time() // midnight secondssincemidnight = 0; Time::Time (int h, int m, int s) CS333 32

secondssincemidnight = s + 60 * m + 3600*h; // Access to attributes int Time::getHours() const return secondssincemidnight / 3600; int Time::getMinutes() const return (secondssincemidnight % 3600) / 60; int Time::getSeconds() const return secondssincemidnight % 60; // Calculations with time void Time::add (Time delta) secondssincemidnight += delta.secondssincemidnight; Time Time::difference (Time fromtime) Time diff; diff.secondssincemidnight = CS333 33

secondssincemidnight - fromtime.secondssincemidnight; * Read a time (in the format HH:MM:SS) after skipping any * prior whitepace. void Time::read (std::istream& in) char c; int hours, minutes, seconds; in >> hours >> c >> minutes >> c >> seconds; Time t (hours, minutes, seconds); secondssincemidnight = t.secondssincemidnight; * Print a time in the format HH:MM:SS (two digits each) void Time::print (std::ostream& out) const out << setfill( 0 ) << setw(2) << gethours() << : << setfill( 0 ) << setw(2) << getminutes() << : << setfill( 0 ) << setw(2) << getseconds(); CS333 34

* Compare two times. Return true iff time1 is earlier than or equal to * time2 bool Time::noLaterThan(const Time& time2) return secondssincemidnight <= time2.secondssincemidnight; * Compare two times. Return true iff time1 is equal to * time2 * bool Time::equalTo(const Time& time2) return secondssincemidnight == time2.secondssincemidnight; The BidCollection ADT: #ifndef BIDCOLLECTION_H #define BIDCOLLECTION_H #include "bids.h" class BidCollection int MaxSize; int size; CS333 35

Bid* elements; // array of bids public: * Create a collection capable of holding the indicated number of bids BidCollection (int MaxBids = 1000); ~BidCollection (); // Access to attributes int getmaxsize() const return MaxSize; int getsize() const return size; // Access to individual elements const Bid& get(int index) const return elements[index]; // Collection operations void addintimeorder (const Bid& value); // Adds this bid into a position such that CS333 36

// all bids are ordered by the time the bid was placed //Pre: getsize() < getmaxsize() void remove (int index); // Remove the bid at the indicated position //Pre: 0 <= index < getsize() * Read all bids from the indicated file void readbids (std::string filename); ; #endif and #include "bidcollection.h" #include "arrayutils.h" #include <fstream> using namespace std; * Create a collection capable of holding the indicated number of bids CS333 37

BidCollection::BidCollection (int MaxBids) : MaxSize(MaxBids), size(0) elements = new Bid [MaxSize]; BidCollection::~BidCollection () delete [] elements; // Collection operations void BidCollection::addInTimeOrder (const Bid& value) // Adds this bid into a position such that // all bids are ordered by the time the bid was placed //Pre: getsize() < getmaxsize() // Make room for the insertion int tobemoved = size - 1; while (tobemoved >= 0 && value.gettimeplacedat().nolaterthan(elements[tobemoved].gettimeplacedat())) elements[tobemoved+1] = elements[tobemoved]; --tobemoved; // Insert the new value elements[tobemoved+1] = value; CS333 38

++size; void BidCollection::remove (int index) // Remove the bid at the indicated position //Pre: 0 <= index < getsize() removeelement (elements, size, index); * Read all bids from the indicated file void BidCollection::readBids (std::string filename) size = 0; ifstream in (filename.c_str()); int nbids; in >> nbids; for (int i = 0; i < nbids; ++i) char c; string biddername; double amount; in >> biddername >> amount; Time bidplacedat; bidplacedat.read (in); CS333 39

string word, line; in >> word; // First word of itemname getline (in, line); // rest of item name string itemname = word + line; addintimeorder (Bid (biddername, amount, itemname, bidplacedat)); The BidderCollection ADT: #ifndef BIDDERCOLLECTION_H #define BIDDERCOLLECTION_H #include "bidders.h" // // Bidders Registered for auction // class BidderCollection int MaxSize; int size; Bidder* elements; // array of items public: CS333 40

* Create a collection capable of holding the indicated number of items BidderCollection (int MaxBidders = 1000); ~BidderCollection (); // Access to attributes int getmaxsize() const return MaxSize; int getsize() const return size; // Access to individual elements Bidder& get(int index) return elements[index]; // Collection operations int add (const Bidder& value); // Adds this bidder to the collection at an unspecified position. // Returns the position where added. //Pre: getsize() < getmaxsize() CS333 41

void remove (int index); // Remove the item at the indicated position //Pre: 0 <= index < getsize() int findbidder (std::string name) const; // Returns the position where a bidde mathcing the given // name can be found, or getsize() if no bidder with that name exists. * Read all items from the indicated file void readbidders (std::string filename); ; #endif and #include <iostream> #include "arrayutils.h" #include <fstream> #include "biddercollection.h" CS333 42

using namespace std; * Create a collection capable of holding the indicated number of items BidderCollection::BidderCollection (int MaxBidders) : MaxSize(MaxBidders), size(0) elements = new Bidder [MaxSize]; BidderCollection::~BidderCollection () delete [] elements; // Collection operations int BidderCollection::add (const Bidder& value) // Adds this bidder //Pre: getsize() < getmaxsize() addtoend (elements, size, value); return size - 1; CS333 43

void BidderCollection::remove (int index) // Remove the bidder at the indicated position //Pre: 0 <= index < getsize() removeelement (elements, size, index); * Read all bidders from the indicated file void BidderCollection::readBidders (std::string filename) size = 0; ifstream in (filename.c_str()); int nbidders; in >> nbidders; for (int i = 0; i < nbidders && i < MaxSize; ++i) string nme; double bal; in >> nme >> bal; Bidder bidder (nme, bal);; add (bidder); CS333 44

* Find the index of the bidder with the given name. If no such bidder exists, * return nbidders. int BidderCollection::findBidder (std::string name) const int found = size; for (int i = 0; i < size && found == size; ++i) if (name == elements[i].getname()) found = i; return found; The ItemCollection ADT: #ifndef ITEMCOLLECTION_H #define ITEMCOLLECTION_H #include "items.h" class ItemCollection int MaxSize; int size; Item* elements; // array of items public: CS333 45

* Create a collection capable of holding the indicated number of items ItemCollection (int MaxItems = 1000); ~ItemCollection (); // Access to attributes int getmaxsize() const return MaxSize; int getsize() const return size; // Access to individual elements const Item& get(int index) const return elements[index]; // Collection operations void addintimeorder (const Item& value); // Adds this item into a position such that // all items are ordered by the time at which the auction for the // item ends. //Pre: getsize() < getmaxsize() CS333 46

void remove (int index); // Remove the item at the indicated position //Pre: 0 <= index < getsize() * Read all items from the indicated file void readitems (std::string filename); ; #endif and #include <iostream> #include "arrayutils.h" #include <fstream> #include "itemcollection.h" // // Items up for auction // using namespace std; CS333 47

* Create a collection capable of holding the indicated number of items ItemCollection::ItemCollection (int MaxItems) : MaxSize(MaxItems), size(0) elements = new Item [MaxSize]; ItemCollection::~ItemCollection () delete [] elements; // Collection operations void ItemCollection::addInTimeOrder (const Item& value) // Adds this item into a position such that // all items are ordered by the time the item auction ends //Pre: getsize() < getmaxsize() // Make room for the insertion int tobemoved = size - 1; while (tobemoved >= 0 && value.getauctionendtime().nolaterthan(elements[tobemoved].getauctionendtime())) elements[tobemoved+1] = elements[tobemoved]; CS333 48

--tobemoved; // Insert the new value elements[tobemoved+1] = value; ++size; void ItemCollection::remove (int index) // Remove the item at the indicated position //Pre: 0 <= index < getsize() removeelement (elements, size, index); * Read all items from the indicated file void ItemCollection::readItems (std::string filename) size = 0; ifstream in (filename.c_str()); int nitems; in >> nitems; for (int i = 0; i < nitems; ++i) Item item; item.read (in); addintimeorder (item); CS333 49

Note how the vast majority of the code is now a collection of encapsulated ADTs, with only a limited amount of very applicationspecific code left outside. This is very typical of well-written C++ applications............................................. CS333 50