260 likes | 394 Views
CSS342: Objects and Classes. Professor: Munehiro Fukuda. Today’s Topics. Class Encapsulation and information hiding From a abstract data specification to a class design Examples List: a list of students Interface and implementation Constructors and destructors Rational: rational numbers
E N D
CSS342: Objects and Classes Professor: Munehiro Fukuda CSS342: Objects and Classes
Today’s Topics • Class • Encapsulation and information hiding • From a abstract data specification to a class design • Examples • List: a list of students • Interface and implementation • Constructors and destructors • Rational: rational numbers • Operator overloading CSS342: Objects and Classes
Class Implementation of method S Encapsulation and Information Hiding • Wall: Not only encapsulate the entire implementation but also make it invisible/inaccessible. • Slit : Interface of the implementation such as arguments and a return value. Program that uses method S Function call with arguments Return a value CSS342: Objects and Classes
Class add remove query Class • Classes: a new data type formed of a collection of data and a set of operations on the data • Data Structures: a construct within a programming language that stores a collection of data Behave as a new data type • Examples: • student lists • rational numbers • complex numbers • currency (cents/dollars) • length measurement (inches/feet) • weight measurement (oz/lbs) Program that uses a class CSS342: Objects and Classes
Class Arnold Berger M 0201 Sorting depends on an implementation. Display a student entry Frank Cioch M 0202 Bill Erdly M 0203 Munehiro Fukuda M 0204 Add a new student entry Chuck Jackels M 0205 Baili Liu F 0206 Delete a student entry Janet McDaniel F 0207 Dina Meske F 0208 Clark Olson M 0209 Check # students Darian Smolar F 0210 List Class Specification CSS342: Objects and Classes
Class List Operations Spec. • create( ): • creates an empty list. • destroy( ): • destroys a list. • insert( int index, Student item): • insert an item in front of the position index. Return true in success. • remove( int index ): • remove the item at the position index. Return true in success. • retrieve( int index, Student& item ): • retrieve the item at the position index, store it in item, and return true in success. • getLength( ): • return the number of items in a list. • isEmpty( ): • return true if the number of items is 0. CSS342: Objects and Classes
Class Arnold Berger M 0201 Frank Cioch M 0202 Bill Erdly M 0203 Munehiro Fukuda M 0204 Chuck Jackels M 0205 Baili Liu F 0206 Janet McDaniel F 0207 Dina Meske F 0208 Clark Olson M 0209 Darian Smolar F 0210 C++ Class public member functions/methods data members Sorting depends on an implementation. create( )/constructor destroy( )/destructor insert( ) remove( ) retrieve( ) getLength( ) isEmpty( ) Utility_func1( ) Utility_func2( ) private CSS342: Objects and Classes
Class C++ Header and Implementation File • Header File (.h) • Write a class specification • Summary of the class usage and behavior • Public member function prototypes • Private data members • Private member function prototypes • Implementation File (.cpp) • Code an implementation of each member function • ClassName::functionName • Function spec (pre/postconditions) in comments • The body of function with appropriate comments CSS342: Objects and Classes
Example: List List Header: list.h #ifndef _List_H_// do not process below if this header has been already read by a compiler #define _List_H_// define “_List_H_” so that this header file will be never read again by a compiler // Summary of the class usage and behavior const int MAX_LIST = 100; typedef Student ListItemType;// typedef int ListItemType in the following slides class List { Public: List( );// a constructor // destructor is supplied by compiler bool isEmpty( ) const;// returns true when a list has no items. int getLength( ) const;// comments on each method bool insert( int index, ListItemtype newItem ); bool remove( int index ); bool retrieve( int index, ListItemTpe& dataItem ) const; priate: vector<ListItemtype> items;// array implementation int size; // # of items int translate( int index ) const;// tranlate the index into the corresponding position } #endif CSS342: Objects and Classes
Example: List Array indexes 12 3 19 100 0 1 3 k–1 MAX_LIST – 1 2 k …. 5 10 18 ? ? …. ? size 1 3 4 k MAX_LIST 2 items Positions in our list spec. An Array Implementation of List Classlist.cpp CSS342: Objects and Classes
Example: List Constructor • A method that describes how an instance of the class is created: Example 1: List( ) { items.resize( MAX_LIST ); } List( int initSize ) { if (initSize > 0 ) items.resize( initSize ) else items.resize( MAX_LIST ); } Example 2: MyClass( int initialValue = 0 ) : myData( initialValue) { } List list; List list(10); MyClass m; MyClass m(10); Initializer List CSS342: Objects and Classes
Example: List Why Initializer Lists? Are the following constructors correct? Class List { public: List( string profName ) { p.name = profName; } private: Professor p; } Class Professor { public: Professor( string n ) { name = n; } private: string name; } Class List { public: List( int courseNumber ) { course = courseNumber; } private: const int course; } Class List { public: List( List &anotherSection ) { another = anotherSection; } private: List &another; } CSS342: Objects and Classes
Example: List 12 3 19 100 Insert insert( 3, newItem ) 44 Shift 3 Shift 2 Shift 1 Array indexes 0 1 3 k–1 MAX_LIST – 1 2 k …. 5 10 18 ? ? …. ? size 1 3 4 k MAX_LIST 2 Positions in our list spec. bool List::insert( int index, ListItemType newItem ) { if ( (index >= 1) && (index <= size + 1) && (size < MAX_LIST) ) { for ( int pos = size; pos >= index; ––pos ) // shift from k to index to the right. items[translate(pos+1)] = items[translate(pos)]; items[translate(index)] = newItem; // insert the item ++size; // increment # items } else return false; } CSS342: Objects and Classes
Example: List Remove remove( 3 ) Shift 1 Shift 2 Shift 3 Array indexes 0 1 3 k–1 MAX_LIST – 1 2 k 12 3 44 19 …. 5 10 18 ? ? …. ? size 1 3 4 k MAX_LIST 2 Positions in our list spec. bool List::remove( int index ) { if ( (index >= 1) && (index <= size) ) { for ( int pos = index + 1; pos <= size; ++pos ) // shift from index+1 to k to the left. items[translate(pos–1)] = items[translate(pos)]; ––size; // decrement # items return true; } else return false; } CSS342: Objects and Classes
Example: List Main program • The main program to test your class is called: a driver program. • The driver program should test all your class methods. • Compilation: g++ list.cpp listDriver.cpp #include “List.h” int main( ) { List aList; ListItemType dataItem; bool success; success = aList.insert(1, 20); aList.retrieve(1, dataItem); … } CSS342: Objects and Classes
Example: Rational Class Rational Header File: rat.hfrom Deitel & Deitel #ifndef RAT_H // To prevent multiple definitions of the same header #define RAT_H // If not fed into a compiler, mark this header as defined. #include <iostream> // For outdate compilers, use #include <iostream.h> using namespace std; class Rational { // A class name should start from a capital letter. public: Rational ( int = 0, int = 1 ); // Default constructor. Rational add( const Rational & a ); // Add a to this and return the result. Rational subtract( const Rational & s ); // Subtract s from this and return the result. Rational multiply( const Rational & m ); // Multiply this by m and return the result. Rational divide( const Rational & d ); // Divide this by d and return the result. void printRational( ) const; // Print numerator / denominator private: int numerator; int denominator; void reduce( ); // A utility function }; #endif CSS342: Objects and Classes
Example: Rational #include “rat.h” // You should insert blank lines for better readability. Rational::Rational( int n, int d ) { numerator = d < 0 ? –n : n; // sign+/- is added to the numerator denominator = d < 0 ? –d; d; reduce( ); // 3/6 → 1/2, 6/8 → 3/4 } Rational Rational::add( const Rational& a ) { // n/d + N/D = (n * D + d * N) / (d * D) Rational t; t.numerator = numerator * a.denominator + denominator * a.numerator; t.denominator = denominator * a.denominator; t.reduce( ); return t; } Rational Rational::subtract( const Rational& s ) { // n/d – N/D = (n * D – d * N) / ( d * D) Rational t; t.numerator = numerator * s.denominator – denominator * s.numerator; t.denominator = denominator * s.denominator; t.reduce( ); return t; } Class Rational Implementation File: rat.cpp CSS342: Objects and Classes
Example: Rational Class Rational Implementation File Cont'd Rational Rational::multiply( const Rational& m ) { // n/d * N/D = (n * N) / (d * D) Rational t; t.numerator = numerator * m.numerator; t.denominator = denominator * m.denominator; t.reduce( ); return t; } Rational Rational::divide( const Rational& v ) { // n/d / N/D = n/d * D/N = (n * D) / (d * N) Rational t; t.numerator = numerator * v.denominator; t.denominator = denominator * v.numerator; t.reduce( ); return t; } void Rational::printRational( ) const { if ( denominator == 0) cout << “DIVIDE BY ZERO ERROR!!!” << endl; else if (numerator == 0) // don’t print out … 0 / 5 cout << 0; else cout << numerator << “ / ” << denominator; } CSS342: Objects and Classes
Example: Rational Rational Class Implementation File Cont’d void Rational::reduce( ) { int n = numerator < 0 ? –numerator : numerator; // get a positive numerator. int d = denominator; // denominator is already positive. int largest = n > d ? n : d; // max(n, d) int gcd = 0; // great common divisor for ( int loop = largest; loop >=2; loop-- ) // check if numerator and denominator if ( numerator % loop == 0 && denominator % loop == 0 ) {// are divisible with loop [max(n,d)…2] gcd = loop; // if so, that loop is gcd! break; } if (gcd != 0) { // If gcd has been found, divide them numerator /= gcd; // by gcd. denominator /= gcd; } } CSS342: Objects and Classes
Example: Rational Class Rational Main Program: ratDriver.cpp • Compilation: g++ rat.cpp ratDriver.cpp #include <iostream.h> #include “rat.h” void main( ) { Rational x(-2, 6), y(-14, -16), z; x.printRational( ); cout << “ + ”; y.printRational( ); z = x.add(y); cout << “ = ” << z.printRational( ) << endl; // Repeat the same test for all methods. } Question: Why can’t we code like that? z = x + y; CSS342: Objects and Classes
Example: Rational #ifndef RAT2_H #define RAT2_H #include <iostream> // for outdated compilers, #include <iostream.h> using namespace std; class Rational { // class spec including assumptions should be provided here friend ostream& operator<< (ostream& output, constRational & r); // those two functions are stand-friend istream& operator>> ( istream& input, Rational & r ); // along functions. public: Rational( int = 0, int = 1 ); // constructor Rational operator+(const Rational &) const; // arithmetic operators:this object + parameter Rational operator–(const Rational &) const; // this object – parameter Rational operator*(const Rational &) const; // this object * parameter Rational operator/(const Rational &) const; // this object / parameter bool operator>(const Rational &) const; // boolean comparison operators: this object > parameter ? bool operator<(const Rational &) const; // this object < parameter ? bool operator>=(const Rational &) const; // this object >= parameter ? bool operator==(const Rational &) const; // this object == parameter ? bool operator!=(const Rational &) const; // this object != parameter ? Rational& operator+=(const Rational &); // assignment operators: this object += parameter // You should also define operator–=, operator*=, and operator /= private: // the same as rat.h }; #endif Operator Overloading: rat2.cpp CSS342: Objects and Classes
Example: Rational + Implementation //----------------------------------------------- + -------------------------------------------- // overloaded +; this object + parameter Rational Rational::operator+( const Rational& a ) const { // operations are the same as Rational::add( const Rational& a ) Rational sum; sum.numerator = numerator * a.denominator + denominator * a.numerator; sum.denominator = denominator * a.denominator; sum.reduce( ); return sum; } CSS342: Objects and Classes
Example: Rational >, ==, and >= Implementation //----------------------------------------------- > -------------------------------------------- // overloaded >; true if this object > parameter, otherwise false bool Rational::operator>( const Rational& r ) const { return float(numerator/denominator) > float(r.numerator/r.denominator); // use float, otherwise fractions are truncated. } //----------------------------------------------- == -------------------------------------------- // overloaded ==; true if this object == parameter, otherwise false bool Rational::operator==( const Rational& r ) const { return numerator == r.numerator && denominator == r.denominator; } //----------------------------------------------- >= -------------------------------------------- // overloaded >=; true if this object >= parameter, otherwise false bool Rational::operator>=( const Rational& r ) const { // once you have defined operators> and ==, you can use them. return *this == r || *this > r; // this is a pointer to this object, and thus *this is this object itself. } CSS342: Objects and Classes
Example: Rational += Implementation //----------------------------------------------- += -------------------------------------------- // overloaded +=; this object += parameter Rational& Rational::operator+=( const Rational& r ) { // should not instantiate a new object. We’d rather add parameter to this object itself. numerator = numerator * r.denominator + denominator * r.numerator; denominator = denominator * r.denominator; reduce( ); return *this; // why must we return the reference rather than the value? } Example: (a+=b)+=c - if a value is returned: 1. a+=b computed; 2. A copy of a generated; 3. (this copy)+=c computed - if the reference is returned: 1. a+=b computed; 2. The reference returned; 3. a+=c computed CSS342: Objects and Classes
Example: Rational << Implementation //----------------------------------------------- << -------------------------------------------- // prints “DIVIDE BY ZERO ERROR!!!” if denominator is zero, // prints whole numbers without denominator (as ints), otherwise uses ‘/’ ostream& operator<<( ostream& output, const Rational& r ) { // we are operating on an ostream object, “output” rather than our Rational. // ostream itself has an operator<< like operator<<(cont int&), operator<<(const float&). // It is unfeasible to define ostream::operator<<(const Rational&) // Thus, this operator<< must be defined as a stand-alone function if (r.denominator == 0) output << “DIVIDE BY ZERO ERROR!!!” << endl; // zero division else if (r.numerator == 0) output << 0; // zero rational else if (r.denominatr == 1) output << r.numerator; // whole number else output << r.numerator << “/” << r.denominator; return output; } CSS342: Objects and Classes
Example: Rational Class Rational Main Program: ratDriver.cpp #include <iostream.h> #include “rat2.h” void main( ) { Rational x(-2, 6), y(-14, -16), z; x.printRational( ); cout << “ + ”; y.printRational( ); z = x + y; cout << “ = ” << z.printRational( ) << endl; // Repeat the same test for all methods. } CSS342: Objects and Classes