30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

472 15. Verschiedenes<br />

so ganz genau sagen und ist vom Compiler abhängig. Entweder er lässt das<br />

Inl<strong>in</strong><strong>in</strong>g der Methode überhaupt bleiben oder er generiert zwei verschiedene<br />

Ausprägungen derselben Methode, e<strong>in</strong>e als <strong>in</strong>l<strong>in</strong>e Methode und e<strong>in</strong>e andere,<br />

die über den Funktionspo<strong>in</strong>ter aufrufbar ist. Auch andere Alternativen s<strong>in</strong>d<br />

möglich, aber e<strong>in</strong>e Diskussion darüber überlasse ich am besten den Compilerbauern<br />

:-).<br />

Im obigen Beispiel habe ich bewusst nur static Members demonstriert.<br />

Wie verhält es sich aber nun mit Funktionspo<strong>in</strong>tern auf Members, die nicht<br />

static s<strong>in</strong>d? Wenn man sich überlegt, dass bei solchen Methoden immer<br />

auch e<strong>in</strong> Scope auf die aktuelle Instanz mit im Spiel ist und dass entsprechend<br />

der this Po<strong>in</strong>ter quasi als versteckter Parameter beim Aufruf mitgegeben<br />

wird, dann kann man sich leicht vorstellen, dass die Situation hierbei nicht<br />

mehr ganz so e<strong>in</strong>fach ist. Wenn man e<strong>in</strong>en Po<strong>in</strong>ter auf e<strong>in</strong>e Methode hat, muss<br />

man also beim Aufruf dafür sorgen, dass irgendwie der Kontext zu e<strong>in</strong>er Instanz<br />

der Klasse, aus der die Methode kommt, erhalten bleibt. Wie das funktioniert,<br />

sieht man am folgenden Beispiel (function_po<strong>in</strong>ter_demo2.cpp):<br />

1 // function po<strong>in</strong>ter demo2 . cpp − demo o f ( someth<strong>in</strong>g l i k e ) function<br />

2 // p o i n t e r s to non−s t a t i c methods<br />

3<br />

4 #<strong>in</strong>clude <br />

5 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

6<br />

7 us<strong>in</strong>g std : : cout ;<br />

8 us<strong>in</strong>g std : : endl ;<br />

9<br />

10<br />

11 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

12 /∗<br />

13 ∗ CalcMethodCollection<br />

14 ∗<br />

15 ∗ j u s t a dummy c o l l e c t i o n of c a l c u l a t i o n methods<br />

16 ∗<br />

17 ∗/<br />

18<br />

19 class CalcMethodCollection<br />

20 {<br />

21 private :<br />

22 CalcMethodCollection ( const CalcMethodCollection &) {}<br />

23 const CalcMethodCollection& operator = ( const CalcMethodCollection&)<br />

24 { return (∗ this ) ; }<br />

25 protected :<br />

26 u<strong>in</strong>t32 m u l t i p l i c a t o r ;<br />

27 u<strong>in</strong>t32 o f f s e t ;<br />

28 public :<br />

29 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

30 CalcMethodCollection ( u<strong>in</strong>t32 m u l t i p l i c a t o r , u<strong>in</strong>t32 o f f s e t )<br />

31 throw ( ) : m u l t i p l i c a t o r ( m u l t i p l i c a t o r ) ,<br />

32 o f f s e t ( o f f s e t ) {}<br />

33<br />

34 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

35 virtual ˜ CalcMethodCollection ( ) { }<br />

36<br />

37 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

38 u<strong>in</strong>t32 aCalculatorMethod ( u<strong>in</strong>t32 val )<br />

39 {<br />

40 return ( val ∗ m u l t i p l i c a t o r ) ;<br />

41 }

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!