aishy amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. creation of...

69
COEN244: Class composition Aishy Amer Electrical & Computer Engineering Outline Introduction Initializing composite objects Constant data members: where to initialize Composite classes share objects? Member initalization list Objects as members of their own class? Reference to objects Pointers to objects Static objects Container class of components Nested classes Composition versus inheritance: a case study “Circle/Point” c A. Amer Class composition 1

Upload: others

Post on 12-Mar-2020

14 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

COEN244: Class composition

Aishy Amer

Electrical & Computer Engineering

OutlineIntroduction

Initializing composite objects

Constant data members: where to initialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classes

Composition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 1

Page 2: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition

Class composition means a class contains an object of adifferent class

A class that has objects of other classes as their datamembers are called composite classes

An object member of a class is called component object

The class of a component object is called component class

Member function of a composite class cannot access privatemembers of included objects

For example, a class Date would be composed of a Timeobject→ Class Date is a client (or user) of class Time

c© A. Amer Class composition 2

Page 3: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: Date/Time

class Time {public :

void setTime ( int , i n t , i n t ) ;void pr in tT ime ( ) const ;

private :i n t hour , minute , second ;

} ;

class Date {public :

Date ( int , int , int , int , int , i n t ) ;void p r i n tDa te ( ) const ;

private :i n t day , month , year ;Time t ime ;

} ;

c© A. Amer Class composition 3

Page 4: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: Date/Time

/ / Think how you would design i t b e t t e r ?Date : : Date ( i n t d , i n t m, i n t y , i n t sec , i n t min , i n t hour ) {

day = d ;month = m;year = y ;t ime . setTime ( sec , min , hour ) ;

}

void Date : : p r i n tDa te ( ) {cout << month << ’ / ’ << day << ’ / ’ << year << ’ ’ ;t ime . p r in tT ime ( ) ;

}

Can class Date access private members of class Time?

c© A. Amer Class composition 4

Page 5: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: Point/Rectangle

/ / L i s t i n g 12 .1 . a composite ob jec t w i th wasted cons t ruc to r c a l l sclass Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tes

public :Po in t ( i n t a=0 , i n t b=0) / / genera l cons t ruc to r

{x = a ; y = b ;cout << " Created : x= " << x << " y=" << y << endl ;

}. . . .

} ;

c© A. Amer Class composition 5

Page 6: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: Point/Rectangle

class Rectangle { / / a composi t ion o f po in t s ?private :

Po in t pt1 , pt2 ; / / top− l e f t , bottom−r i g h t corner po in t si n t th i ckness ; / / th i ckness o f the rec tang le border

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width =1) ;. . .

} ;

c© A. Amer Class composition 6

Page 7: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Testing Point/Rectangle

Poin t p1 (20 ,40) , p2 (70 ,90 ) ; / / top− l e f t , bottom−r i g h t cornersRectangle rec ( p1 , p2 , 4 ) ; / / cons t ruc t rec

/ / a l t e r n a t i v e l y ( bad choice )/ / c lass Rectangle / / a composi t ion o f po in t s ?/ / {/ / p r i v a t e :/ / i n t x1 , y1 , x2 , y2 ; / / top− l e f t , bottom−r i g h t corner po in t s/ / i n t th ickness ; / / th ickness o f the rec tang le border/ / p u b l i c :/ / Rectangle ( const i n t xx1 , const i n t yy1 ,

const i n t xx2 , const i n t yy2 , i n t width =1) ;

c© A. Amer Class composition 7

Page 8: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

All data members could be specified in the memberinitialization list (MIL)

However,1. For members that are themselves class objects,

they should be initialized in the member initialization list2. Constant data members (including references) can only

be initialized inside the member initialization list

Object data members are first created before the compositeclass constructor is called

c© A. Amer Class composition 8

Page 9: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

With wasted constructor calls/ / L i s t i n g 12 .1 . a composite ob jec t w i th wasted cons t ruc to r c a l l sclass Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tes

public :Po in t ( i n t a=0 , i n t b=0) / / genera l cons t ruc to r

{x = a ; y = b ;cout << " Created : x= " << x << " y=" << y << endl ;

}Po in t ( const Poin t& pt ) / / copy cons t ruc to r

. . .void operator = ( const Poin t& pt ) / / assignment opera tor

. . .. . . . .

} ;

c© A. Amer Class composition 9

Page 10: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Wasted callsclass Rectangle {

private :Po in t pt1 , pt2 ; / / top− l e f t , bottom−r i g h t corner po in t si n t th i ckness ; / / th i ckness o f the rec tang le border

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width =1) ;. . . .

} ;

Rectangle : : Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width ){ pt1 = p1 ; pt2 = p2 ; th ickness = width ; } / / se t data members

c© A. Amer Class composition 10

Page 11: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Wasted callsPoin t p1 (20 ,40) , p2 (70 ,90 ) ;/ / 1 . p1 and p2 created , Po in t genera l cons t ruc to r c a l l e d

Poin t po i n t (100 ,120) ;/ / 2 . po i n t i s created , Po in t genera l cons t ruc to r c a l l e d

Rectangle rec ( p1 , p2 , 4 ) ;/ / 3 . Creat ion o f Rectangle ob jec t rec/ / 3 . 1 . c rea t i on o f pt1 and pt2 , c a l l i n g Po in t d e f a u l t cons t ruc to r s/ / Note : Po in t d e f a u l t cons t ruc to r s are c a l l e d before the/ / the Rectangle ob jec t i s created !/ / 3.2 assignment opera tor i s c a l l e d

c© A. Amer Class composition 11

Page 12: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Wasted calls

→ For large composite objects, the process of creation canbecome quit wasteful. What to do?

The solution: Member initialization list (MIL)

Rectangle : : Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t w): th ickness (w) , pt1 ( p1 ) , pt2 ( p2 ) / / i n i t i a l i z a t i o n l i s t

{ } / / empty member body

c© A. Amer Class composition 12

Page 13: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Saving calls/ / L i s t i n g 12 .2 . A composite ob jec t w i thou t wasted cons t ruc to r c a l l sclass Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tes

public :Po in t ( i n t a=0 , i n t b=0) / / genera l cons t ruc to r

{x = a ; y = b ;cout << " Created : x= " << x << " y=" << y << endl ;

}Po in t ( const Poin t& pt ) / / copy cons t ruc to r

. . .void operator = ( const Poin t& pt ) / / assignment opera tor

. . .. . . .

} ;

c© A. Amer Class composition 13

Page 14: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Saving callsclass Rectangle {

private :Po in t pt1 , pt2 ; / / top− l e f t , bottom−r i g h t corner po in t si n t th i ckness ; / / th i ckness o f the rec tang le border

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width =1) ;. . .

} ;

/ / Be t te r choice : copy cons t ruc to r c a l l sRectangle : : Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t w)

: th ickness (w) , pt1 ( p1 ) , pt2 ( p2 ) / / i n i t i a l i z a t i o n l i s t{ } / / empty member body

c© A. Amer Class composition 14

Page 15: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Saving callsPoin t p1 (20 ,40) , p2 (70 ,90 ) ;/ / 1 . p1 and p2 created , Po in t genera l cons t ruc to r c a l l e d

Poin t po i n t (100 ,120) ;/ / 2 . po i n t i s created , Po in t genera l cons t ruc to r c a l l e d

Rectangle rec ( p1 , p2 , 4 ) ;/ / 3 . Creat ion o f Rectangle ob jec t rec/ / 3 . 1 . pt1 and pt2 created , Po in t copy cons t ruc to r c a l l e d/ / 3.2 No assignment opera tor i s c a l l e d ! Saving !

c© A. Amer Class composition 15

Page 16: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Initializing composite objects

Summary

The purpose of the member initialization list is to avoida call to the default constructor of the component classbefore the call to the composite class constructor

The member initialization list replaces the call

to the default constructor of the component class

with the call to the constructor specified in the initialization list

c© A. Amer Class composition 16

Page 17: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 17

Page 18: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant variable?

Many usage of "const":const i n t x ; / / constant i n tx = 2; / / i l l e g a l − can ’ t modify x

const i n t ∗ pX ; / / changeable p o i n t e r to constant i n t∗pX = 3; / / i l l e g a l − can ’ t use pX to modify an i n tpX = &someOtherIntVar ; / / l e g a l − pX can po in t somewhere e lse

i n t ∗ const pY ; / / constant p o i n t e r to changeable i n t∗pY = 4; / / l e g a l − can use pY to modify an i n tpY = &someOtherIntVar ; / / i l l e g a l − can ’ t make pY po in t anywhere e lse

const i n t ∗ const pZ ; / / const p o i n t e r to const i n t∗pZ = 5; / / i l l e g a l − can ’ t use pZ to modify an i n tpZ = &someOtherIntVar ; / / i l l e g a l − can ’ t make pZ po in t anywhere e lse

c© A. Amer Class composition 18

Page 19: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant variable?

i n t y ;const i n t ∗ pConstY = &y ; / / l e g a l − but can ’ t use pConstY to modify yi n t ∗ pMutableY = &y ; / / l e g a l − can use pMutableY to modify y∗pMutableY = 42;

const i n t x ; / / x cannot be modi f ied

const i n t ∗ pX = &x ; / / pX i s the address o f a const i n t/ / and can ’ t be used to change an i n t

∗pX = 4; / / i l l e g a l − can ’ t use pX to change an i n t

i n t ∗ p I n t ; / / address o f normal i n tp I n t = pX ; / / i l l e g a l − cannot conver t from const i n t ∗ to i n t ∗

i n t ∗ p I n t ; / / address o f a normal i n tp I n t = &x ; / / i l l e g a l − cannot conver t from const i n t ∗ to i n t ∗

c© A. Amer Class composition 19

Page 20: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant data members

Where to initialize?

What is common in the following data?account number, employee date of hire, price paid, ID, weightof one unit of area

How often they change? Does it make sense to changethem?

Recall: with const int x=10;x cannot be assigned any value later

In analogy: a constant data memberhas to be initialized immediately after it is created

How can we do it?

c© A. Amer Class composition 20

Page 21: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant data members

Member initialization listclass Rectangle {

private :Po in t pt1 ;Po in t pt2 ;i n t th i ckness ;const double weight ; / / weight o f one u n i t o f area

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , double wt , i n t width =1) ;

. . . .} ;

Rectangle : : Rectangle ( const Poin t& p1 , const Poin t& p2 , double wt , i n t width ): th ickness ( width ) , pt1 ( p1 ) , pt2 ( p2 ) , weight ( wt )/ / i n i t i a l i z a t i o n o f weight ( wt ) here i s mandatory

{ }

c© A. Amer Class composition 21

Page 22: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant data members

Another exampleclass MyClass {

private :i n t hours ; / / I s ’ hours ’ declared here?i n t minutes ;const i n t s ize ;

public :MyClass ( i n t h , i n t m, i n t s )

: hours ( h ) , minutes (m) , s ize ( s ) / / member i n i t i a l i z a t i o n l i s t{ }

void p r i n t ( ) const{

cout << " your c lass data are \ n " ;cout << " Hours : " << hours << ’ ’

<< " Minutes : " << minutes << ’ ’ << " Size : " << s ize << endl ;}

c© A. Amer Class composition 22

Page 23: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant data members

void set ( i n t a , i n t b , i n t c ) {/ / s i ze=a ; / / ∗∗∗TRY IT ∗∗∗∗ : uncomment t h i s l i n e to t e s t/ / so you want to change s ize ?/ / Well , s ince s ize i s constant the compi ler w i l l not l e t t h i s go/ / cons t_ tes t . cpp : 5 6 : assignment o f read−only member ‘ MyClass : : s i ze ’hours = b ;minutes = c ;

}

void operator = ( const MyClass &c ) {hours = c . hours ;minutes=c . minutes ;/ / s i ze = c . s ize ; / / ∗∗∗TRY IT ∗∗∗∗ : uncomment t h i s l i n e to t e s t/ / the compi ler w i l l not agree ! ! s i ze i s const => cannot be changed !/ / E r ro r : assignment o f read−only member ‘ MyClass : : s i ze ’

}} ; / / end c lass

c© A. Amer Class composition 23

Page 24: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Constant data members

MyClass mc(5 ,10 ,60 ) ;/ / w i th t h i s you are dec la r i ng & i n i t i a l i z i n g/ / the ob jec t mc i n c l u d i n g hours , minutes and s ize ./ / They are being created ( " cons t ruc ted " ) w i th a s p e c i f i e d value ./ / Thus they are being i n i t i a l i z e d . I f you change t h e i r/ / value l a t e r w i th opera tor = t h a t i s an assignment ./ / l i k e mc=mc1 ;mc. p r i n t ( ) ; / / p r i n t s 5 ,10 ,60mc. set ( 6 , 5 , 7 ) ;mc. p r i n t ( ) ; / / p r i n t s 6 ,5 ,60

MyClass mc1(15 ,20 ,70) ;/ / so you want to assign mc1 to mc/ / t h i s imp l i es you would change the const data member s ize ! ! !mc=mc1 ; / / s i ze i s not / cannot be changed !mc. p r i n t ( ) ; / / p r i n t s 15 ,20 ,60

c© A. Amer Class composition 24

Page 25: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Composite classes share objects?

Can a data member of a class be shared by two composite classobjects?

|−−−−−|| ||−−−−−x−−−−−−−| 2 po in t s o f a rec tang le shared wi th two other ob jec ts

| ||−−−−−−−x−−−−−−|

|−−−−−−|

An object can be shared using reference or pointer to an object

c© A. Amer Class composition 25

Page 26: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 26

Page 27: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Reference data members

Recall: all references in C++ are constant:1. they cannot change after they are initialized2. but their content can change

Hence,reference data members must be initialized only in a memberinitialization list

Note:Point& pt1;→ pt1 is a reference (an alias) that cannot change but itscontent can be changedconst Point& pt1;→ pt1 is a reference that cannot change; its contentscannot change either

c© A. Amer Class composition 27

Page 28: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Reference data members: Example

class Rectangle {private :

Po in t& pt1 ; / / shared : re ference cannot be changedPoin t& pt2 ; / / shared : re ference cannot be changedi n t th i ckness ; / / th i ckness o f the rec tang le borderconst double weight ; / / weight o f one u n i t o f area

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , double wt , i n t width =1) ;. . . .

} ;

c© A. Amer Class composition 28

Page 29: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Reference data members: Example

Rectangle : : Rectangle ( const Poin t& p1 , const Poin t& p2 , double wt , i n t width ): pt1 ( p1 ) , pt2 ( p2 ) , weight ( wt )

/ / pt1 ( p1 ) i s mandatory because r e f i s constant{ th ickness=width ; }

Q: What about the rightmost parameters in a constructor?Can you tell what is wrong with ...

Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width =1 , double wt ) ;/ / H in t : Rectangle R( p1 , p2 , width , wt ) ; or Rectangle R( p1 , p2 , wt , width ) ;

c© A. Amer Class composition 29

Page 30: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Pointers members of composite classes

class Rectangle {private :

Po in t ∗pt1 ; / / can be shared and changedPoin t ∗pt2 ;i n t th i ckness ; / / th i ckness o f the rec tang le borderconst double weight ; / / weight o f one u n i t o f area

public :Rectangle ( const Poin t∗ p1 , const Poin t∗ p2 , double wt , i n t width =1) ;. . . .

} ;

Rectangle : : Rectangle ( const Poin t∗ p1 , const Poin t∗ p2 , double wt , i n t width ): th ickness ( width ) , pt1 ( p1 ) , pt2 ( p2 ) , weight ( wt )

/ / pt1 ( p1 ) not mandatory here/ / Note : pt1 ( p1 ) i s p o i n t e r i n i t i a l i z a t i o n −− not copy cons t ruc to r/ / You may pass Po in te rs as not const ; Then they can be changed{ }

c© A. Amer Class composition 30

Page 31: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Pointers members of composite classes

Poin t∗ p= new Poin t (20 ,40 ) ;Po in t∗ q=new Poin t (70 ,90 ) ;

Rectangle rec ( p , q , 4 ) ;/ / 3 . Creat ion o f Rectangle ob jec t rec/ / 3 . 1 . pt1 and pt2 po in te r s are assigned They Po in t to p and q .

c© A. Amer Class composition 31

Page 32: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 32

Page 33: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Member initialization list

Mandatory:

Constant data memebrs including references (which areconstant), constant pointers, ...

Call to base class constructor

Reference to a component object

Prefered:

Initialize component objects(i.e., objects as member of other classes)it saves extra calls

Optional:

A pointer to a component object

Other data members (non-static)c© A. Amer Class composition 33

Page 34: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Member initialization list

Practical programmers:

emphasize initializing ALL data members in ALL constructors(primitive or user-defined)

initalize most of the data memebrs in the MIL

initialzie data members IN ORDER of declaration unless youABSOLUTELY cannot (see example below)

c© A. Amer Class composition 34

Page 35: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Member initialization list

Examples of the “absolutely cannot”

When the initialization procedure is complexdata = new Sample ∗ [MAX_ELEMENT ] ; / / Two dimensional a r rayfor ( unsigned i n t i = 0 ; i < MAX_ELEMENT ; i ++)data [ i ] = new Sample [MAX_ELEMENT ] ;

When there is an important comment to make before aparticular initialization line

His to r y ( ) : s i ze ( 3 ) , count ( 0 ) , i dx ( 0 ) {/ / The f o l l o w i n g l i n e i s the source o f BUG 3876data = new Sample [MAX_ELEMENT ] ;i f ( data == NULL) {cout << ’ ’No memory a l l o c a t e d ’ ’ <<endl ; e x i t ( 1 ) ;

}cout << ’ ’ user created defaul t cons t ruc to r o f H i s to r y c a l l e d ’ ’ <<endl ;

}

c© A. Amer Class composition 35

Page 36: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 36

Page 37: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Objects as members of their own class?

Recall:

Data members are allocated in the order in which they arelisted in the class declaration

Static data (members) are one time allocated at the beginningof program execution

Static data (members) are destroyed after the programterminate

c© A. Amer Class composition 37

Page 38: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Objects as members of their own class?

/ / An ob jec ts as member o f i t s own c lassclass Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tesPoin t o r i g i n ; / / can I do t h i s ?

. . .} ;

Po in t p ; / / P i s created means/ / memory f o r x and y i s a l l o c a t e d/ / memory f o r o r i g i n i s a l l o c a t e d/ / memory f o r x and y of o r i g i n i s a l l o c a t e d/ / memory f o r o r i g i n o f o r i g i n i s a l l o c a t e d . ./ / . . . e tc . i n f i n i t e recu rs i ve loop !

→ (non-static) objects as members of their own class aredisallowed

c© A. Amer Class composition 38

Page 39: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Reference to objects as members of their own class?

/ / An ob jec ts as member o f i t s own c lassclass Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tesPoin t &o r i g i n ; / / can I do t h i s ?

public :Po in t ( Po in t &org , i n t a=0 , i n t b=0) : o r i g i n ( org ){ x=a ; y=b ; } / / o r i g i n ( org ) mandatory

. . .} ;

c© A. Amer Class composition 39

Page 40: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Reference to objects as members of their own class?

Poin t ∗p=0; / / p set to n u l lPoin t ∗p = new Poin t (∗p , 8 0 , 9 0 ) ; / / a l l o c a t e memory and set to 80 ,90Poin t p1 ( p ) ; / / ∗p i s used as the o r i g i n f o r p1

→ Do not use (non-static) objects as members of their own classunless you have toBut what is the solution then?

c© A. Amer Class composition 40

Page 41: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Static objects as members of their own class

/ / L i s t i n g 12.3 Using s t a t i c data members and a s t a t i c member f u n c t i o n .class Poin t {

private :i n t x , y ; / / p r i v a t e coord ina tess t a t i c i n t count ;s t a t i c Poin t o r i g i n ;

public :Po in t ( i n t a=0 , i n t b=0) / / genera l cons t ruc to r

{x = a ; y = b ; count ++;cout << " Created : x=" << x << " y=" << y

<< " count= " << count << endl ;}

c© A. Amer Class composition 41

Page 42: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Static objects as members of their own class

s t a t i c i n t q u a n t i t y ( ) / / const i s not al lowed{ return count ; }

. . .~Po in t ( ) { / / d e s t r u c t o r

count−−;cout <<" Po in t destroyed : x=" <<x <<" y=" <<y <<endl ;

}} ;

c© A. Amer Class composition 42

Page 43: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Static objects as members of their own class

i n t Poin t : : count = 0 ; / / i n i t i a l i z a t i o nPoin t Po in t : : o r i g i n (640 ,0 ) ; / / i n i t i a l i z a t i o n/ / ou tput : ’ Created : x=640 y=0 count =1 ‘

cout << " Number o f po in t s : " << Po in t : : q u a n t i t y ( ) << endl ;/ / ou tput : Number o f po in t s : 1

Poin t p1 , p2 (30 ) , p3 (50 ,70 ) ;/ / ou tput : 0 ,0 ,2 30 ,0 ,3 and 50 ,70 ,4

cout << " Number o f po in t s : " << p1 . q u a n t i t y ( ) << endl ;/ / ou tput : number o f po in t s : 4/ / Output from hidden c a l l s :/ / destroyed 50 ,70 destroyed 30 ,0 destroyed 0 ,0/ / But why ‘ destroyed 640 ,0 ’ i s not output ?/ / ==> s t a t i c data are destroyed a f t e r the program termina te

c© A. Amer Class composition 43

Page 44: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

A note to return types

Any difference between:1. Polynomial Polynomial::operator = (Polynomial& p);//with return *this;2. Polynomial& Polynomial::operator = (Polynomial& p);//with return *this

There is a BIG difference!

Without the ’&’ a copy of the object to be returned is made,and this copy is subsequently returned

With the ’&’ you are returning a reference to the object, whichsimply means you are not making a copy of the object toreturn

There are several implications related to this which we havediscussed in class

c© A. Amer Class composition 44

Page 45: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 45

Page 46: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

class Rectangle {private :

Po in t pt1 , pt2 ; / / top− l e f t , bottom−r i g h t corner po in t si n t th i ckness ; / / th i ckness o f the rec tang le border

public :Rectangle ( const Poin t& p1 , const Poin t& p2 , i n t width =1) ;

. . . .} ;

Rectangle conta ins a f i x e d c o l l e c t i o n o f components : two

A container class includes a ‘dynamically’ created collectionof components

Useful: when we need a data type that contains a dynamiccollection of values

How often we need such thing?c© A. Amer Class composition 46

Page 47: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

While the program executes, we would like to add moreobjects to the container

Why? for temporary storage or for processing

Example:Container class: customer charge accountcomponents: customer credit card transactions to beprocessedProcessing: totals, taxes, printing, reports, searching, etc.

But why not using an array for that?

c© A. Amer Class composition 47

Page 48: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

With an array we cannot perform high level tasks such asaddition, search, validation, setting values of subcomponents, checking the index, etc.

Container classes are designed to perform these operation forthe client code

The client code does not need to deal with low-levelimplementations

c© A. Amer Class composition 48

Page 49: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Container classes: an example

For simplicity: a Sample component class with one datamember

The Sample objects are produced for example by a stockexchange ticker tape, a patient monitoring device, or apressure observation.

For simplicity, we assume the values for the Sample class arehard-coded in an array

c© A. Amer Class composition 49

Page 50: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Container classes: an example

/ / L i s t i n g 12.7 A con ta ine r c lass w i th dynamical ly−a l l o c a t e d memory

class Sample { / / component c lassprivate :double value ; / / sample value

public :Sample ( double x = 0) / / d e f a u l t and convers ion cons t ruc to r

{ value = x ; }void set ( double x ) / / mod i f i e r method

{ value = x ; }double get ( ) const / / s e l e c t o r method

{ return value ; }} ;

c© A. Amer Class composition 50

Page 51: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

class His to r y { / / con ta ine r c lass : set valueprivate :

i n t size , count , i dx ;Sample ∗data ; / / could be an ar ray o f data

public :H i s to r y ( ) : s i ze ( 3 ) , count ( 0 ) , i dx ( 0 ) / / make ar ray empty

{data = new Sample [ s ize ] ; / / a l l o c a t e new spacei f ( data == NULL)

{ cout << " Out o f memory \ n " ; e x i t ( 1 ) ; }}

~ H i s to r y ( ) { delete [ ] data ; } / / f r ee dynamic memory

Note: Since "Sample *data" is not a constant it must not beinitialize in the MIL

c© A. Amer Class composition 51

Page 52: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

void add ( double ) ; / / add a sample a t the end

Sample& getComponent ( ) / / r e t u r n re ference to Sample{ return data [ i dx ] ; } / / can be a message t a r g e t

void g e t F i r s t ( ) { i dx = 0; }bool getNext ( ) { return ++ idx < count ; }void average ( ) const ; / / p r i n t average

} ;

c© A. Amer Class composition 52

Page 53: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

void His to r y : : add ( double s ) {i f ( count == s ize ) {

s ize = s ize ∗ 2; / / double s ize i f out o f spaceSample ∗p = new Sample [ s ize ] ;i f ( p == NULL)

{ cout << " Out o f memory \ n " ; e x i t ( 1 ) ; } / / t e s t f o r successfor ( i n t i =0; i < count ; i ++)

p [ i ] = data [ i ] ; / / copy e x i s t i n g elementsdelete [ ] data ; / / de le te e x i s t i n g ar raydata = p ; / / rep lace i t w i th new ar raycout << " new s ize : " << s ize << endl ; / / debugging p r i n t

}data [ count ++ ] . se t ( s ) ; / / use next space a v a i l a b l e

}

c© A. Amer Class composition 53

Page 54: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Class composition: container class

void His to r y : : average ( ) const {cout << " \ n Average value : " ;double sum = 0;for ( i n t i = 0 ; i < count ; i ++)

sum += data [ i ] . get ( ) ;cout << sum / count << endl ;

}

c© A. Amer Class composition 54

Page 55: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Testing container class

double a [ ] = {3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 } ; / / i npu t dataHis to r y h ;for ( i n t i =0; i < 9 ; i ++)

h . add ( a [ i ] ) ; / / add h i s t o r ycout << " \ n Measurement h i s t o r y : " << endl << endl ;h . g e t F i r s t ( ) ; / / work i s pushed updo {

cout << " " << h . getComponent ( ) . get ( ) ;/ / p r i n t each component

} while ( h . getNext ( ) ) ;h . average ( ) ;

/ / Output :new s ize : 6new s ize : 12Measurement h i s t o r y : 3 5 7 11 13 17 19 23 29Average : 14.1111

c© A. Amer Class composition 55

Page 56: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Container classes

Container classes with more complex design includesorting, search, removal, insertion, update, comparison

A significant number of container classes are availablefrom the Standard Template Library

c© A. Amer Class composition 56

Page 57: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Nested classes

In C++, we can define a server class inside a client class

This way the nested class name is not visible outside of thecomposite class

Nested class definitions can appear in either the private orpublic section

In both cases Nested class is hidden from the rest of theprogram

Nested class cannot be used to declare variables of its type inother scopes outside the composite class

c© A. Amer Class composition 57

Page 58: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Nested classes

class His to r y {private :

class Sample{ / / component c lass

private :double value ; / / sample value

public :Sample ( double x = 0) / / d e f a u l t and convers ion cons t ruc to r

{ value = x ; }void set ( double x ) / / mod i f i e r method

{ value = x ; }double get ( ) const / / s e l e c t o r method

{ return value ; }} ;

i n t size , count , i dx ;Sample ∗data ;

c© A. Amer Class composition 58

Page 59: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Nested classes

public :H i s to r y ( ) : s i ze ( 3 ) , count ( 0 ) , i dx ( 0 ) { / / make ar ray empty

data = new Sample [ s ize ] ; / / a l l o c a t e new spacei f ( data == NULL)

{ cout << " Out o f memory \ n " ; e x i t ( 1 ) ; }}. . . .

} ;

/ / Usedouble a [ ] = {3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 } ; / / i npu t data

His to r y h ;for ( i n t i =0; i < 9 ; i ++)

h . add ( a [ i ] ) ; / / add h i s t o r y. . .Sample s =5; / / OK?His to r y : : Sample s =5; / / OK? when?

c© A. Amer Class composition 59

Page 60: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Outline

Introduction

Initializing composite objects

Constant data members: where toinitialize

Composite classes share objects?

Member initalization list

Objects as members of their own class?

Reference to objects

Pointers to objects

Static objects

Container class of components

Nested classesComposition versus inheritance: a case study “Circle/Point”

c© A. Amer Class composition 60

Page 61: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Composition or inheritance?

Composition: the existence of a "has-a" relationshipaggregate objects in a class

Inheritance: the existence of a “is-a” relationship conceptuallyconnect classes in an inheritance hierarchy

In most problems, inheritance is very useful and should beoften considered, however,

Inheritance forces the client programmer to learn aconsiderable amount about the server design, speciallywhen the hierarchy is tallDependencies between classes in inheritance are verystrong

c© A. Amer Class composition 61

Page 62: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Composition or inheritance?

Composition is conceptually simpler & links between classesare not as strong

Composition is, in general, easier to maintain

Choice depends on degree of similarity between relatedclasses

If the number of common methods is small & the number ofmethods to be is large, composition is a good alternative

If a “is-a” relationship is not clear then use composition:A Rectangle "has a" Point but it is not a Point;A Cylinder "has a" Circle or "is a" Circle?An Address "is a" Name or "has a" Name?

c© A. Amer Class composition 62

Page 63: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: composition

/ / L i s t i n g 14.2 code reuse through c lass composi t ionclass C i r c l e { / / o r i g i n a l code f o r reuse

protected : / / i n h e r i t a n c e i s one of the opt ionsdouble rad ius ; / / i n t e r n a l data

public :s t a t i c const double PI ; / / i t must be i n i t i a l i z e dC i r c l e ( double r ) ; / / convers ion cons t ruc to rdouble getLength ( ) const ; / / compute c i rcumferencedouble getArea ( ) const ; / / compute areadouble getRadius ( ) const ;void set ( double r ) ; / / change s ize

} ;const double C i r c l e : : PI = 3.1415926536;

c© A. Amer Class composition 63

Page 64: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: composition

class Cy l inder { / / new c lass Cy l inderprotected :

C i r c l e c ; / / no PI , no rad iusdouble he igh t ; / / new code

public :Cy l inder ( double r , double h ) : c ( r ) / / i n i t i a l i z e r l i s t ( no PI )

{ he igh t = h ; }double getLength ( ) const { return c . getLength ( ) ; } / / from c lass C i r c l edouble getRadius ( ) const { return c . getRadius ( ) ; } / / from c lass C i r c l evoid set ( double r ) { c . se t ( r ) ; } / / from c lass C i r c l edouble getVolume ( ) const / / no getArea ( )

{double rad ius = c . getRadius ( ) ;return C i r c l e : : PI ∗ rad ius ∗ rad ius ∗ he igh t ;

}} ;

c© A. Amer Class composition 64

Page 65: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: composition

i n t main ( ) {Cy l inder cy l1 ( 2 . 5 , 6 . 0 ) , cy l2 ( 5 . 0 , 7 . 5 ) ; / / i n i t i a l i z e datadouble l eng th = cy l1 . getLength ( ) ; / / s i m i l a r to C i r c l ecy l1 . se t ( 3 . 0 ) ;double diam = 2 ∗ cy l1 . getRadius ( ) ; / / no c a l l to getArea ( )double vo l = cy l2 . getVolume ( ) ; / / not i n C i r c l ecout << " Circumference of f i r s t c y l i n d e r : " << leng th << endl ;cout << " Volume of the second c y l i n d e r : " << vo l << endl ;cout << " Diameter o f the f i r s t c y l i n d e r : " << diam << endl ;return 0;}

c© A. Amer Class composition 65

Page 66: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: inheritance

/ / L i s t i n g 14.3 code reuse through i n h e r i t a n c eclass C i r c l e { / / o r i g i n a l code f o r reuse

protected : / / i n h e r i t a n c e i s one of the opt ionsdouble rad ius ; / / i n t e r n a l data

public :s t a t i c const double PI ; / / i t must be i n i t i a l i z e dC i r c l e ( double r ) ; / / convers ion cons t ruc to rdouble getLength ( ) const / / compute c i rcumference

{ return 2 ∗ PI ∗ rad ius ; }double getArea ( ) const ; / / compute areadouble getRadius ( ) const ;void set ( double r ) ; / / change s ize

} ;const double C i r c l e : : PI = 3.1415926536;

c© A. Amer Class composition 66

Page 67: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: inheritance

class Cy l inder : public C i r c l e { / / new c lass Cy l inderprotected :

double he igh t ; / / o ther data i s i n C i r c l epublic :

Cy l inder ( double r , double h ) : C i r c l e ( r ) / / i n i t i a l i z e r l i s t ( no PI ){ he igh t = h ; } / / new code

double getVolume ( ) const / / no getArea ( ){ return he igh t ∗ getArea ( ) ; } / / a d d i t i o n a l c a p a b i l i t y

} ;

c© A. Amer Class composition 67

Page 68: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Circle/Cylinder: inheritance

i n t main ( ) {Cy l inder cy l1 ( 2 . 5 , 6 . 0 ) , cy l2 ( 5 . 0 , 7 . 5 ) ; / / i n i t i a l i z e datadouble l eng th = cy l1 . getLength ( ) ; / / s i m i l a r to C i r c l ecy l1 . se t ( 3 . 0 ) ;double diam = 2 ∗ cy l1 . getRadius ( ) ; / / no c a l l to getArea ( )double vo l = cy l2 . getVolume ( ) ; / / not i n C i r c l ecout << " Circumference of f i r s t c y l i n d e r : " << leng th << endl ;cout << " Volume of the second c y l i n d e r : " << vo l << endl ;cout << " Diameter o f the f i r s t c y l i n d e r : " << diam << endl ;return 0;

}

c© A. Amer Class composition 68

Page 69: Aishy Amer - users.encs.concordia.caamer/teach/coen244/notes/composition.pdf · / / 3. Creation of Rectangle object rec / / 3.1. creation of pt1 and pt2 , calling Point default constructors

Review

class Rectangle {private :

Po in t p ;. . .

}/ / which Const ruc torRectangle ( Po in t& q , . . . ) { p=q ; . . . } / / = d e f a u l t cons t r . +assignment op/ / orRectangle ( Po in t& q , . . . ) : p ( q ) { . . . } / / copy cons t ruc to r

/ / What i s i n a member i n i t i a l i z a t i o n l i s t ?

c© A. Amer Class composition 69