• No results found

Programsystemkonstruktion med C++: ¨Ovning 2

N/A
N/A
Protected

Academic year: 2021

Share "Programsystemkonstruktion med C++: ¨Ovning 2"

Copied!
23
0
0

Loading.... (view fulltext now)

Full text

(1)

Programsystemkonstruktion med C++: ¨Ovning 2

Programsystemkonstruktion med C++: ¨ Ovning 2

Karl Palmskog palmskog@kth.se

september 2010

(2)

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) {}

} ;

(3)

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 ;

}

(4)

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”

(5)

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 ; }

} ;

(6)

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 ; }

(7)

Programsystemkonstruktion med C++: ¨Ovning 2 Specalfunktioner i klasser

En arvshierarki

Animal string name

Donkey Horse

Mule

(8)

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

(9)

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 ; } } ;

(10)

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 ( )

(11)

Programsystemkonstruktion med C++: ¨Ovning 2 Virtuella funktioner

Implementation av virtuella funktioner

Mule v-table {...}

V-table

*func1

*func2

(12)

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 ; }

(13)

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 ( ) {

. . . }

. . . } ;

(14)

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

(15)

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 ; }

} ;

(16)

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 ; }

} ;

(17)

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 ;

}

(18)

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?

(19)

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 ;

}

(20)

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

(21)

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

(22)

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

(23)

Programsystemkonstruktion med C++: ¨Ovning 2 Templates

Namngivningstips

globala variabler: longVarName medlemsvariabler: varNam

lokala variabler: tmp, i, cnt, f, ...

konstanter: CONST NAME klasser: LongClassName

medlemsfunktioner: longFuncName globala funktioner: LongFuncName

statiska medlemsfunktioner: LongFuncName

References

Related documents

Man skulle kunna hävda att det initiala subjektet delas av två samordnade verbfraser och då argumentera för att anledningen till att exempel (18b) är ogrammatiskt inte alls

Eftersom funktionen är kontinuerlig i det slutna intervallet antar funktionen sitt största (och sitt minsta) värde i en punkt c.. Svar a) Antagandet att funktionen är deriverbar på

Var noga med att undvika trängsel och hålla avstånd till andra på platser där många samlas, till exempel i butiker, köpcentrum, restauranger, uteserveringar och på

UNDVIK RÖRA VID ÖGON, NÄSA ELLER MUN. AVOID TOUCHING YOUR EYES, NOSE

I Socialstyrelsens sammanställning finns även läkemedel där man bör säkerställa att indikationen verkligen finns och att inte behandlingen pågår längre än nödvändigt men de

• Tänk på att äldre personer och personer med andra kroniska sjukdomar (hjärt- och lungsjukdomar, diabetes, cancer och så vidare) är särskilt känsliga för

• Klasser som är till hjälp för implemen- tationen bör ärvas private. • Man vill inte ha implementationsdetaljer i

• Konstruktor som är private ger möjlighet att förhindra användandet av t.ex. med delete eller då det hamnar utom räckvidd) anropas