Operator Overloading, Mehrfachvererbung, Safe Pointer, Observer
Operator Overloading Ziel: Verwendung der gängigen Operatoren (+, =, ==,... ) für benutzerdefinierte Typen Funktionsweise von Operatoren Funktionen spezieller Syntax unäre, binäre Operationen Definition beim Typ des (ersten) Operators
Operator overloading Deklaration von Operatoren äquivalent zu Methodendeklaration statt Methodenname Schlüsselwort operator gewünschter Operator es gelten alle Regeln für overloading, overriding, virtual wie bei Methoden Deklaration abhängig von gewünschter Funktionalität des Operators Rückgabewert als neues Objekt oder Referenz leere Parameterliste bei unärem, ein Parameter bei binärem Operator
Operator overloading retType [&]operator symb ([param]) [const] retType Ergebnis der Operation z.B. bool bei '==' oder Ausgangstyp bei '+' & wenn der zurückgegebene Wert keine neue (temporäre) Variable ist z.B. bei '+='
Operator overloading retType [&]operator symb ([param]) [const] symb zu definierendes Operatorsymbol param leer bei unären Operatoren rechter Operand bei binären Operatoren const Basisoperand wird nicht geändert nicht bei '+='
Operator overloading Unäres Minus '-' (Beispiel) classType operator – () const; Addition mit Zuweisung '+=' (Beispiel) classType &operator += (const classType &var);
Mehrfachvererbung Eine Klasse kann von mehreren Basisklassen abgeleitet werden Auflistung des Basisklassen durch Komma separiert class derived : public base1, public base2 Eigenschaften und Methoden aus beiden Basisklassen stehen zur Verfügung Vorsicht bei Ambiguitäten!
Mehrfachvererbung Problem Ambiguität Beide (oder mehrere) Basisklassen verwenden die gleiche Methoden- / Eigenschaftsbezeichnung Methode / Eigenschaft muss in abgeleiteter Klasse überschrieben werden (overriding) überschriebene Methode muss sich um Aufruf der Basisklassen kümmern Auflösung über ScopeOperator
Safepointer Ziel: ein Pointer zeigt entweder auf ein gültiges Objekt, oder auf NULL Vermeidung von Speicherfehlern Weitere Eigenschaften Objekt löschen, wenn keine Referenzen mehr darauf zeigen Sicheres Umgehen mit zirkulären Referenzen
Safepointer Kapselung von nativen Pointern in eine Templateklasse Funktionalitäten Automatisches Initialisieren des Pointers bei Definition Funktion zum Erstellen eines Objektes Löschen von nicht mehr verwendeten Objekten Referenzzähler zwei Arten von Safepointern zur Vermeidung zirkulärer Referenzen
Safepointer Variablen der eigentliche Zeiger Referenzzähler ○ starke Referenzen ○ gesamte Referenzen 2 unterschiedliche Klassen starke und schwache Pointer schwache Pointer erhöhen nur die gesamten Referenzen Schwache Zeiger liefern NULL, wenn die Anzahl der starken Referenzen 0 ist.
Safepointer zusätzliche Eigenschaften threadsicheres Inkrementieren und Dekrementieren der Referenzzähler Überladung der Pointeroperationen *, ->, Zuweisung Überladung der Vergleichsoperationen unabhängig ob schwacher oder starker Pointer Funktion zum wrappen nativer (normaler) Pointer cast Operationen
Observer - Pattern 1:n Abhängigkeit Benachrichtigung an abhängige Objekte, wenn das beobachtete Objekt seinen Zustand geändert hat Publish-Subscribe zur Erhaltung der Konsistenz lose gekoppelter Objekte
Observer - Pattern observer 1 tabelle observer 2 balken- diagramm observer 3 onlineupdate subject a=20 s="C++" f=23.45 Änderungsmitteilung Änderung, Anfrage
Observer – Pattern (Anwendung) Kapselung verschiedener Aspekte einer Abstraktion, bei der ein Aspekt vom anderen abhängig ist Eine Änderung eines Objektes erfordert die Änderung einer unbekannten Anzahl anderer Objekte Ein Objekt soll andere Objekte benachrichtigen können, ohne nähere Informationen zu diesen Objekten zu besitzen
Observer - Pattern Quelle: Gamma et al.: Design Patterns
Observer - Pattern Subject kennt seine Observer eine beliebige Anzahl Observer Objekte kann das Subject beobachten definiert ein Interface zum Hinzufügen und Entfernen von Observern Observer definiert ein Update-Interface, welches von Änderungen im Subject benachrichtigt werden soll
Observer - Pattern ConcreteSubject von Subject abgeleitet hält für ConcreteObserver interessante Zustände sendet eine Mitteilung an seine Observer, wenn sich sein Zustand geändert hat ConcreteObserver von Observer abgeleitet hält eine Referenz auf ConcreteSubject hält Zustände, die konsistent mit Zuständen von ConcreteSubject sein sollen implementiert das Update-Interface zur Sicherstellung der Konsistenz
C++ Bibliotheken Boost C++ Libraries freie, von Experten geprüfte, plattformunabhängige C++ Quellenbibliothek zielen auf Standardisierung Teile bereits im ersten Technischen Report des C++ Standards Committee low-level Funktionalitäten
C++ Bibliotheken Qt plattformübergreifende Klassenbibliothek nicht C++ exclusiv zur Entwicklung grafischer Benutzeroberflächen bis Version 4.4 GPL, ab 4.5 LGPL Entwickler: QT Software
C++ Bibliotheken OGRE Object-Oriented Graphics Rendering Engine 3D-Engine zur Verwendung hardwarebeschleunigter 3D Grafik unterstützt Direct3D und OpenGL gute Dokumentation
ENDE