500 likes | 649 Views
Engineering Problem Solving with C++, Etter/Ingber. Chapter 8 An Introduction to Classes. An Introduction To Classes. Programmer Defined Types Design and Implementation of Classes Class Composition Constructors The vector class private M ethods. Programmer defined types. Data Types.
E N D
Engineering Problem Solving with C++, Etter/Ingber Chapter 8 An Introduction to Classes Engineering Problem Solving with C++, second edition, J. Ingber
An Introduction To Classes • Programmer Defined Types • Design and Implementation of Classes • Class Composition • Constructors • The vector class • private Methods Engineering Problem Solving with C++, second edition, J. Ingber
Programmer defined types Engineering Problem Solving with C++, second edition, J. Ingber
Data Types • A data type is a concrete implementation of a concept. • Built in types include: • int, double, char • Pre-defined class types include: • string, istream, ostream • Real world applications work with concepts that are not available as built-in or pre-defined types. Engineering Problem Solving with C++, second edition, J. Ingber
Programmer Defined Types • Consider the concept of a point in a plane, defined as a: • xCoordinate • yCoordinate • Subtraction between points can be defined as a binary operation that returns the distance between two points in a plane. Point p1, p2; double dist; dist = p2-p1; • As a programmer, we can define a new type named Point by defining a C++ class named Point. Engineering Problem Solving with C++, second edition, J. Ingber
Programmer Defined Types • A well-designed class type provides: • a good public interface. • encapsulation of the implementation. • A good public interface provides a complete yet minimal set of public operations. • Encapsulation hides the implementation from the user. • A good public interface and encapsulation allow for efficient maintenance and expandability of the class type. Engineering Problem Solving with C++, second edition, J. Ingber
class declaration class implementation Design and implementation of classes Engineering Problem Solving with C++, second edition, J. Ingber
Defining C++ Classes • The definition of a class consists of two parts: • The class declaration • saved in a file with a .h extension • The class implementation • saved in a file with a .cpp extension • the .cpp file should #include the .h file Engineering Problem Solving with C++, second edition, J. Ingber
The class Declaration • A class declaration begins with the key word class followed by an identifier that specifies the name of the new class. • The body of the class declaration is a statement block that includes: • declaration statements for the data members (attributes) • prototypes for the member functions (methods) • Keywords public, protected and private controlthe accessibility of the attributes and methods. Engineering Problem Solving with C++, second edition, J. Ingber
Example - Point class Declaration //Point class declaration: // filename: Point.h class Point { private: double xCoord, yCoord;//private attributes public: //Two accessor methods: double getX() const; double getY() const; //Two mutator methods: void setX(double newX); void setY(double newY); //Distance Formula double operator –(const Point& p2) const; }; semicolon is required! Engineering Problem Solving with C++, second edition, J. Ingber
The Point class Declaration • Two private attributes (encapsulation). • Five public methods (public interface). • The use of the const modifier in the prototypes of the accessor methods prohibits modification of the calling object. • The const modifier is not used with the mutator methods because the intent of a mutator method is modification of the calling object. Engineering Problem Solving with C++, second edition, J. Ingber
Method Definition • A method is a function that is a member of class. • A method header must include the name of a class, followed by the scope resolution operator (::) and the name of the method. Syntax: return type class-name::method-name([parameter list])[modifier] Engineering Problem Solving with C++, second edition, J. Ingber
The class Implementation • The class implementation includes a definition for each of the methods declared in the class declaration. • The scope resolution operator (::) is required in the method header to associate the method name with the name of the class in which the method is declared to be a member. • The class implementation file must include the class declaration (.h file). Engineering Problem Solving with C++, second edition, J. Ingber
Implementation of Point class //implementation for Point //filename: Point.cpp #include "Point.h" //Required for Point #include <cmath> //Required for sqrt(),pow() //accessor method double Point::getX() const { return xCoord; } //mutator method void Point::setX(double newX) { xCoord = newX; } Engineering Problem Solving with C++, second edition, J. Ingber
Implementation of Point class //Distance Formula double Point::operator –(const Point& rhs) const { double t1, t2, d; t1 = rhs.xCoord – xCoord; //(x2-x1) t2 = rhs.yCoord – yCoord; //(y2-y1) d = std::sqrt( std::pow(t1,2) + std::pow(t2,2) ); return d; } xCoord and yCoord are provided by the calling object. std:: is required when the using namespace std; statement is not given. Engineering Problem Solving with C++, second edition, J. Ingber
The Calling Object • An object is an instance of a class. • Objects reference (call) the public methods defined for their class. Example: #include "Point.h" //Required for Point #include <iostream> //Required for cout int main() { //A Point has an xCoord and a yCoord Point p1; //p1 is a Point p1.setX(5.1); //p1 is the calling object std::cout << p1.getX() << std::endl; return 0; } Output: 5.1 Engineering Problem Solving with C++, second edition, J. Ingber
UML CLASS DIAGRAM FOR POINT Point -xCoord -yCoord +getX() +getY() +setX() +setY() +operator –() Note: - => private + => public Engineering Problem Solving with C++, second edition, J. Ingber
class composition Engineering Problem Solving with C++, second edition, J. Ingber
Class Composition • Object oriented problem solutions are built around class hierarchies and associations. • Classcomposition is an association used to model a "has-a" relationship between classes: • the whole "has-a" component. • the component is "part-of" the whole. • Class composition allows for efficient building of complex programmer defined types. Engineering Problem Solving with C++, second edition, J. Ingber
Example: • A rectangle is a shape that has a: • point of origin • width • height • Implement the concept of a rectangle by defining a programmer defined type named Rectangle. Engineering Problem Solving with C++, second edition, J. Ingber
UML CLASS COMPOSITION DIAGRAM Rectangle • double width • double height • Point origin 1 Point Engineering Problem Solving with C++, second edition, J. Ingber
default constructors parameterized constructors function overloading Constructors Engineering Problem Solving with C++, second edition, J. Ingber
Constructors • A constructor is a method designed to build an instance of a class. • A constructor has the same name as its class. • A constructor has no specified return value. • A constructor is called automatically each time an object is defined. Syntax: class-name::class-name([parameter list])[:initialization list] { } Engineering Problem Solving with C++, second edition, J. Ingber
Constructors • There are two forms of constructors: • Default Constructor • constructor with no formal parameters, other than default parameters. • attributes are initialized to the default value. • Parameterized Constructor • constructor with one or more formal parameters. • constructor arguments determine the initial values of the attributes. Engineering Problem Solving with C++, second edition, J. Ingber
Default Constructor: Point • Prototype: add to Point.h Point(); or Point(double x=0, double y=0); x=0 and y=0 are default parameters. Engineering Problem Solving with C++, second edition, J. Ingber
Default Constructor: Point • Definition: add to Point.cpp Point::Point() { xCoord = yCoord = 0; } or Point::Point(double x, double y) { xCoord = x; yCoord = y; } Engineering Problem Solving with C++, second edition, J. Ingber
Example: Default Constructor Point p1; //Default constructor is called. Memory snapshot: Point p1 0.0 double xCoord 0.0 double yCoord Engineering Problem Solving with C++, second edition, J. Ingber
Parameterized Constructor: Point • Prototype: add to Point.h Point(double xVal, double yVal); • Definition: add to Point.cpp Point::Point(double xVal, double yVal) { xCoord = xVal; yCoord = yVal; } Engineering Problem Solving with C++, second edition, J. Ingber
Example: Parameterized Constructor Point p1(1.5, 4.2); //Parameterized constructor. Memory snapshot: Point p1 double xCoord 1.5 4.2 double yCoord Engineering Problem Solving with C++, second edition, J. Ingber
Point.h Revisited: //Point class declaration: // filename: Point.h class Point { private: double xCoord, yCoord;//private attributes public: //Two constructors: Point(); Point(double x, double y); //Two accessor methods: double getX() const; double getY() const; //Two mutator methods: void setX(double newX); void setY(double newY); //Distance Formula double operator –(const Point& p2) const; }; Point constructors are example of overloaded methods. Engineering Problem Solving with C++, second edition, J. Ingber
Function Overloading • Function overloading occurs when one or more functions have the same name. • Point(); • Point(double x, double y); • Overloaded functions share the same name, but each function must have a unique function signature. • A function signature includes the : • function name • parameter list • modifiers • return value is NOT part of the function signature. Engineering Problem Solving with C++, second edition, J. Ingber
Practice! Implement the following class declaration: class Rational { private: int num, denom; public: rational( ); // initialize to 1/1 rational(int n, int d); int getNum(); int getDenom(); }; Engineering Problem Solving with C++, second edition, J. Ingber
parameter passing The vector class Engineering Problem Solving with C++, second edition, J. Ingber
The vector class • The vector class is a pre-defined classtemplate included in the C++ Standard Template Library. • The vector class provides a generic implementation of the concept of an array. • vector objects can increase and decrease their size dynamically. Engineering Problem Solving with C++, second edition, J. Ingber
vector Objects • We can define an instance of the vectorclass in a type declaration statement. Syntax: vector<data-type> identifier[(size,initial-value)] Examples: vector <double> list; //empty vector vector<string> wordList(n); //capacity:n strings //vector of 8 integers, each initialized to 0 vector<int> intList(8,0); J. Ingber Introduction to C++
vector class • #include <vector> //pre-defined in STL • Common member functions: empty() // returns true if vector contains no values pop_back() // deletes last element in vector push_back() // add element to end of vector resize() // changes the size of vector size() // returns the size of vector capacity() // returns the capacity of vector J. Ingber Introduction to C++
Operators • The square bracket operator ( [ ] ) is defined for vector objects. • The assignment operator ( = )is defined for vectors of the same type. Example: vector<int> list(10); vector<int>newList; list[0]=10; … newList = list; cout << newList.size() << endl; //method J. Ingber Introduction to C++
Parameter Passing • When a vector object is passed as an argument to a function, the default is pass by value. • Pass by reference can be specified with the & operator. Example: void scale(vector<double>& dVec, double sFactor); void print(vector<double> dVec);//pass by value void print2(const vector<double>& dVec); Point closeToOrigin(vector<Point> pointVec); Engineering Problem Solving with C++, second edition, J. Ingber
private methods Engineering Problem Solving with C++, second edition, J. Ingber
Helper Methods • private or protected member functions. • Called by other member functions. • Designed to "help" behind the scenes. Engineering Problem Solving with C++, second edition, J. Ingber
Example • Design a class to implement the concept of a unit vector. • Attributes: • an anchor point (the base of the vector) • an orientation of 0 - 360 degrees. • Methods: • translate(double dx, double dy): • rotate (int dDegrees); Engineering Problem Solving with C++, second edition, J. Ingber
Translation - change position but not orientation Engineering Problem Solving with C++, second edition, J. Ingber
Rotation - change orientation around anchor point Engineering Problem Solving with C++, second edition, J. Ingber
Class Declaration class UnitVector { public: UnitVector(); // contstructors UnitVector(double init_x, double init_y, int init_orientation); void rotate(int d_orient); // rotate the vector void translate(double dx, double dy); // translate the // vector. private: //helper function void fixOrientation(); // Calculate a legal orientation double x, y; // The anchor point of the object. int orientation; //orientation }; Engineering Problem Solving with C++, second edition, J. Ingber
Class Implementation //Constructors UnitVector::UnitVector(double initX, double initY, int initO)) : x(initX), y(initY), orientation(initO) { fixOrientation(); } UnitVector::UnitVector( ): x(0), y(0), orientation(0) { } Engineering Problem Solving with C++, second edition, J. Ingber
Member Function Definitions // rotate the calling vector void UnitVector::rotate(int d_orient) { orientation += d_orient; fixOrientation(); } // translate the calling vector void UnitVector::translate(double dx, double dy) { x += dx; y += dy; } Engineering Problem Solving with C++, second edition, J. Ingber
Helper Function Definition //This function adjusts the orientation value //Original orientation may be < 0 or >= 360) //Adjusted orientation is 0<=orientation < 360. void UnitVector::fixOrientation() { if(orientation < 0) orientation = 360 + orientation%360; else orientation = orientation%360; } Engineering Problem Solving with C++, second edition, J. Ingber
Practice! Which of the statements on the right is valid within a main program which contains an include for this header file. class rational { private: int num, denom; int LCD( ); public: rational( ); rational(int n, int d); void input (istream & istr ); void output (ostream & ostr); void reduce ( ); }; • rational A; • rational B(5, 9); • input(A); • B.output(cout); • int div=B.LCD(); • A.denom = 3; • B.reduce; Engineering Problem Solving with C++, second edition, J. Ingber