005
18.04.2016, 16:35 Uhr
ao
(Operator)
|
Das funktioniert in diesem Fall, weil Punkt eine sehr primitive Klasse ist, die keine objektorientierten Elemente hat (Ableitung, virtuelle Methoden). Ein Punkt-Objekt besteht nur aus dem Speicher für die beiden Membervariablen und kann wie ein C-Struct per Zuweisung kopiert werden. Abgesehen von ein bisschen Syntax (Konstruktor und Destruktor, insertKoord-Methode mit Referenzparameter, Ausgabe über C++-Streams) könnte man das auch ganz ohne C++ als C-Programm formulieren.
Bei Klassen, die von anderen Klassen abgeleitet sind, ist dieses Konstruieren per Kopieren nicht so einfach möglich, da muss im Speicher noch einiges gemacht werden, was man besser dem Compiler überlässt. Das hat mit der sogenannten VTable zu tun, einer Tabelle von Funktionspointern, die jeder Compiler (g++, Microsoft-C++, Borland-C++, ...) auf seine eigene Weise verwalten darf. Da fummelt man besser nicht drin herum.
Das Beispiel ist ein bisschen zu einfach, um die Stärken von OO zu demonstrieren, hier überwiegt noch der Overhead (Copy-Konstruktor, =-Operator, wozu soll ich das alles machen?). Aber wenn du lernen und ausprobieren willst, dann definier mal Pfad nicht mit einem Punkt*, sondern mit einem std::vector<Punkt> und pass alles andere daran an. insertKoord macht dann nur noch push_back, und malloc und free brauchst du gar nicht mehr, und new und delete auch nicht.
Die Punkt-Klasse selber muss bestimmte Anforderungen erfüllen (Copy-Konstruktor, operator=, siehe oben), die du erst mal bereitstellen musst, damit du Punkte in einem vector verwalten kannst. Die Anwender-Klassen, die mit dem vector und seinem Inhalt umgehen (Pfad und weitere) werden dafür um einiges einfacher. Und es funktioniert auch dann noch, wenn nicht mehr Punkte verarbeitet werden, sondern erheblich komplexere Objekte. |