Programsystemkonstruktion med C++: ¨Ovning 2
Programsystemkonstruktion med C++: ¨ Ovning 2
Karl Palmskog palmskog@kth.se
september 2010
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
Konstruktorer
i konstruktorerna f¨ or en klass initieras klassens medlemmar initialv¨ arden kan ges i kolonlista eller i kodblock
deklareras konstruktorn inte anv¨ ands en f¨ orvald
f¨ orvald konstruktor k¨ or medlemmars f¨ orvalskonstruktor
kopieringskonstruktorn tar en instans av klassen som argument finns f¨ orvald kopieringskonstruktor som kopierar medlemmarna
c l a s s V e h i c l e {
p r i v a t e : i n t w e i g h t ; p u b l i c :
V e h i c l e ( i n t w) : w e i g h t (w) {}
} ;
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
Destruktorer
finns bara en destruktor som inte tar n˚ agra argument om ej definierad finns f¨ orvald destruktor
f¨ orvald destruktor k¨ or medlemmars destruktor
P e r s o n : : ˜ P e r s o n ( ) {
// f r e e up memory f o r a r r a y o f heap−a l l o c a t e d s k i l l s d e l e t e [ ] s k i l l s ;
}
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
Tilldelningsoperatorer och Rule of Three
vid tilldelning av variabel till klassinstans anropas tilldelningsoperatorfunktionen operator=
den f¨ orvalda operator= kopierar medlemmarna tumregler:
1 om du beh¨over definiera destruktor beh¨over du definiera kopieringskonstruktor och operator=
2 om du beh¨over definiera kopieringskonstruktor beh¨over du definiera destruktor och operator=
3 om du beh¨over definiera operator= beh¨over du definiera destruktor och kopieringskonstruktor
destruktor, kopieringskonstruktor och operator= “h¨ or ihop”
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
#i n c l u d e <i o s t r e a m >
c l a s s Foo { p r i v a t e :
i n t a ; p u b l i c : Foo ( ) {
s t d : : c o u t << ” d e f a u l t c o n s t r u c t o r ” << s t d : : e n d l ; }
Foo ( c o n s t Foo &o t h e r ) {
s t d : : c o u t << ” c o p y c o n s t r u c t o r ” << s t d : : e n d l ; a = o t h e r . a ;
}
˜ Foo ( ) {
s t d : : c o u t << ” d e s t r u c t o r ” << s t d : : e n d l ; }
Foo &o p e r a t o r =( c o n s t Foo &o t h e r ) {
s t d : : c o u t << ” a s s i g n m e n t o p e r a t o r ” << s t d : : e n d l ; a = o t h e r . a ;
r e t u r n ∗ t h i s ; }
} ;
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
Exempel p˚ a anv¨ andning av specialfunktioner
#i n c l u d e ” f o o . h ”
i n t main ( i n t a r g c , c o n s t c h a r ∗ a r g v [ ] ) {
Foo a ; Foo b ( a ) ; Foo c = a ; Foo d ; d = a ; r e t u r n 0 ; }
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
En arvshierarki
Animal string name
Donkey Horse
Mule
Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser
Specialfunktioner och arv
Objekt Konstruktor Destruktor Animal Animal ˜Animal
Donkey Animal ˜Donkey
Donkey ˜Animal
Horse Animal ˜Horse
Horse ˜Animal
Mule Animal ˜Mule
Donkey ˜Horse
Animal ˜Animal
Horse ˜Donkey
Mule ˜Animal
Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner
Virtuella funktioner
icke virtuella funktioner v¨ aljs statiskt vid kompilering beroende p˚ a typ av pekare eller referens
virtuella funktioner best¨ ams dynamiskt under exekvering baserat p˚ a objektets faktiska typ
#i n c l u d e <i o s t r e a m >
u s i n g namespace s t d ; c l a s s A {
p u b l i c :
v o i d f o o ( ) { c o u t << ”A : : f o o ( ) ” << e n d l ; }
v i r t u a l v o i d b a r ( ) { c o u t << ”A : : b a r ( ) ” << e n d l ; } } ;
c l a s s B : p u b l i c A { p u b l i c :
v o i d f o o ( ) { c o u t << ”B : : f o o ( ) ” << e n d l ; } v o i d b a r ( ) { c o u t << ”B : : b a r ( ) ” << e n d l ; } } ;
Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner
Virtuella funktioner i praktiken
#i n c l u d e ” ab . h ” i n t main ( ) {
B b ;
B ∗ b P t r = &b ; A ∗ a P t r = b P t r ; b P t r −>f o o ( ) ; b P t r −>b a r ( ) ; a P t r −>f o o ( ) ; a P t r −>b a r ( ) ; r e t u r n 0 ; }
$ . / a . o u t B : : f o o ( ) B : : b a r ( ) A : : f o o ( ) B : : b a r ( )
Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner
Implementation av virtuella funktioner
Mule v-table {...}
V-table
*func1
*func2
Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner
Virtuella destruktorer
Vad ¨ ar problemet med f¨ oljande kod?
c l a s s A { p u b l i c :
˜A ( ) { s t d : : c o u t << ” ˜A ( ) ” << s t d : : e n d l ; } } ;
c l a s s B : p u b l i c A { p u b l i c :
˜B ( ) { s t d : : c o u t << ” ˜B ( ) ” << s t d : : e n d l ; } } ;
i n t main ( ) {
A∗ a = new A ( ) ; A∗ b = new B ( ) ;
d e l e t e a ; d e l e t e b ; }
Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner
Pure virtual-funktioner
om en funktion ¨ ar pure virtual m˚ aste den implementeras av
¨
arvande klasser
motsvarar abstrakta metoder i Java
c l a s s A { p u b l i c :
v i r t u a l i n t f o o ( ) = 0 ; . . .
} ;
c l a s s B : p u b l i c A { p u b l i c :
v i r t u a l i n t f o o ( ) {
. . . }
. . . } ;
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Templates
templates (mallar) anv¨ ands f¨ or att skriva typoberoende kod ett alternativ till arv f¨ or delade beteenden
funktioner och klasser parametriseras p˚ a en given typ
kompilatorn ers¨ atter f¨ orekomster av typparametern och skapar
parameterfri funktion/klass
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
c l a s s S t a c k { p r i v a t e :
s t a t i c c o n s t i n t STK SIZE = 1 0 0 ; i n t m s t k [ STK SIZE ] ;
i n t m top ; p u b l i c :
S t a c k ( ) : m top ( 0 ) {}
b o o l i s E m p t y ( ) { r e t u r n ( m top == 0 ) ; } b o o l i s F u l l ( ) { r e t u r n ( m top >= STK SIZE ) ; } b o o l p u s h ( i n t v a l ) {
i f ( i s F u l l ( ) ) r e t u r n f a l s e ; m s t k [ m top++] = v a l ; r e t u r n t r u e ;
}
b o o l pop ( i n t &v a l ) {
i f ( i s E m p t y ( ) ) r e t u r n f a l s e ; v a l = m s t k [−−m top ] ;
r e t u r n t r u e ; }
} ;
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
t e m p l a t e <typename T>
c l a s s S t a c k { p r i v a t e :
s t a t i c c o n s t i n t STK SIZE = 1 0 0 ; T m s t k [ STK SIZE ] ;
i n t m top ; p u b l i c :
S t a c k ( ) : m top ( 0 ) {}
b o o l i s E m p t y ( ) { r e t u r n ( m top == 0 ) ; } b o o l i s F u l l ( ) { r e t u r n ( m top >= STK SIZE ) ; } b o o l p u s h ( c o n s t T &v a l ) {
i f ( i s F u l l ( ) ) r e t u r n f a l s e ; m s t k [ m top++] = v a l ; r e t u r n t r u e ;
}
b o o l pop (T &v a l ) {
i f ( i s E m p t y ( ) ) r e t u r n f a l s e ; v a l = m s t k [−−m top ] ;
r e t u r n t r u e ; }
} ;
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Anv¨ andning av templatiserad klass
#i n c l u d e <i o s t r e a m >
#i n c l u d e ” s t a c k . h ” i n t main ( ) {
S t a c k <i n t > i s t k ; // s t a c k o f i n t
S t a c k <double> f s t k ; // s t a c k o f d o u b l e s i s t k . p u s h ( 4 7 1 1 ) ;
i s t k . p u s h ( 4 7 . 1 1 ) ; f s t k . p u s h ( 4 7 . 1 1 ) ; f s t k . p u s h ( 4 7 1 1 ) ; i n t i t o p ;
i s t k . pop ( i t o p ) ;
s t d : : c o u t << i t o p << s t d : : e n d l ; r e t u r n 0 ;
}
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
En typparametriserad maxfunktion
Tentauppgift: skriv en typparametriserad funktion max som returnerar det st¨ orsta av tv˚ a argument.
t e m p l a t e<typename T>
c o n s t & T max ( c o n s t T & x , c o n s t T & y ) { i f ( x < y ) {
r e t u r n y ; } e l s e {
r e t u r n x ; }
}
F¨ oljdfr˚ agor:
vad kr¨ aver din typparametriserade funktion av argumenten?
varf¨ or ¨ ar returtypen en referens?
varf¨ or kan man inte ge argument av olika typer?
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Metaprogrammering med templates
#i n c l u d e <i o s t r e a m >
t e m p l a t e<i n t N>
s t r u c t f a c t {
enum { v a l u e = N ∗ f a c t <N−1 >:: v a l u e } ; } ;
t e m p l a t e<> s t r u c t f a c t <0> { enum { v a l u e = 1 } ;
} ;
i n t main ( ) {
s t d : : c o u t << f a c t <5 >:: v a l u e << s t d : : e n d l ; r e t u r n 0 ;
}
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Kompilering av templatiserade klasser och funktioner
templateklasser/funktioner m˚ aste vara definierade innan de anv¨ ands
normalt sker d¨ arf¨ or b˚ ade deklaration och definition i .h-filen
kompilatorn beh¨ over d˚ a inte ges namnet p˚ a klassfilen
st¨ od f¨ or separation av definition/deklaration varierar mellan
kompilatorer
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Templatisering vs. gemensam superklass
Templates Gemensam superklass
+ ˚ ateranv¨ andning av kod + ˚ ateranv¨ andning av kod + statisk typkontroll + flexibilitet
+ effektiv implementation - typkontroll vid k¨ orningstid - definition innan anv¨ andning - overhead
- l˚ angsam kompilering
- stor bin¨ arfil
Programsystemkonstruktion med C++: ¨Ovning 2 Templates
Kodningstips
ge klasser, funktioner och medlemmar beskrivande namn dela upp klassdeklarationer och -definitioner i tv˚ a filer indentera ordentligt
undvik enraders if-satser, anv¨ and alltid { och } undvik om m¨ ojligt n¨ astlade if/for satser skriv inte f¨ or l˚ anga funktioner, dela upp
versionshantera all kod med program som mercurial och git
anv¨ and testramverk och skriv om m¨ ojligt testerna innan koden
Programsystemkonstruktion med C++: ¨Ovning 2 Templates