Laufzeit-Typinformationen

Mithilfe der Laufzeit-Typinformation (runtime type information, RTTI) ist es möglich, zur Programmlaufzeit die Datentypen zweier Daten zu vergleichen oder deren interne Namen abzufragen. Dazu liefert der Operator typeid() in einer Struktur type_info, die in der Header-Datei type_info definiert ist, Informationen zurück.

type_info& typeid(DTYP);

DTYP ist entweder der Datentyp oder das Datum, dessen Typinformation bestimmt werden soll.

Zur Auswertung des Ergebnisses des typeid() Operators stellt die Struktur type_info u.a. folgende Methoden zur Verfügung:

Methode Bedeutung
bool operator == (const type_info& COp) Vergleicht, ob zwei Datentypen identisch sind.
const char* name() Liefert einen Zeiger auf den Datentyp als C-String; der Inhalt des C-Strings ist nicht standardisiert.

Somit kann z.B. mit folgender Anweisung verglichen werden, ob zwei Daten vom gleichen Typ sind:

if (typeid(obj1) == typeid(obj2))
   ...

Von der Struktur type_info kann kein Objekt erzeugt werden. D.h., folgende Anweisung liefert beim Übersetzen einen Fehler:

std::type_info tinfo = typeid(obj);

Übungen

rtti_01:

Definieren Sie jeweils eine Klasse für die Grafikobjekte Kreis, Rechteck und Polygon (Vieleck). Alle drei Klassen sind von einer gemeinsamen Basisklasse für Grafiken abzuleiten. Die Klassen für die Grafikobjekte enthalten nur die Methode Draw(), die lediglich einen Text ausgibt (siehe nachfolgende Ausgabe).

Schreiben Sie eine Funktion (keine Methode!), die zufallsgesteuert ein Objekt des Grafiktyps Kreis, Rechteck oder Polygon erzeugt und den Zeiger darauf zurückliefert. Eine solche Funktion, die zur Erzeugung eines Objekts dient, wird als Klassenfabrik (class factory) bezeichnet. Da die Funktion sowohl einen Kreis, ein Rechteck oder ein Polygon erzeugt, muss sie einen bestimmten Returntyp besitzen.

Erzeugen Sie in main() mittels der Klassenfabrik zehn zufällige Grafikobjekte und speichern diese ab. Geben Sie die Grafikobjekte zur Kontrolle aus.

Bestimmen Sie anschließend, wie oft jedes der drei Grafiken (Kreis, Rechteck und Polygon) erzeugt wurde und geben das Ergebnis aus.

Polygon zeichnen
Polygon zeichnen
Rechteck zeichnen
Rechteck zeichnen
Polygon zeichnen
Rechteck zeichnen
Kreis zeichnen
Kreis zeichnen
Rechteck zeichnen
Polygon zeichnen
2 Objekte vom Typ class Circle[Graphics]
4 Objekte vom Typ class Rect[Graphics]
4 Objekte vom Typ class Polygon[Graphics]