Problem mit abstrakten Klassen und Pointern
-
Hallo zusammen,
ich habe in einem Programm eine abstrakte Klasse (nennen wir sie Hauptklasse) von der ich verschiedene Klassen (Unterklasse1, Unterklasse2, ...) ableite. Des weiteren habe ich eine Klasse (Nennen wir sie Manager), die mehrere Instanzen von Unterklasse1 und Unterklasse2 verwalten soll. Die Verbindung von Manager mit den Instanzen der Unterklassen habe ich im Moment mit Pointern vom Typ Hauptklasse realisiert, die auf Elemente von Unterklasse1 oder Unterklasse2 gerichtet werden. Wenn ich nun mein Programm compiliere und ausführe erhalte ich einen Segmentation Fault, da ich Pointer vom Typ Hauptklasse verwende um auf Unterklasse1 oder Unterklasse2 zu zeigen (so vermute ich). Allerdings möchte ich Hauptklasse als gemeinsame Schnittstelle beibehalten, um flexibel bei der Einbindung von unterschiedlichen Unterklassen zu sein. Gibt es eine Möglichkeit, das zu tun?
Hier noch zur Vorstellung:
class Hauptklasse { ... }; class Unterklasse_1 : public Hauptklasse { ... }; class Unterkalsse_2 : public Hauptklasse { ... }; class Manager { Hauptklasse *pointer_1; Hauptklasse *pointer_2; .... }; Unterklasse_1 *Instanz1 = new Unterklasse_1(); Manager->pointer_1 = Instanz1; // Hier tritt der Fehler auf-> Segmentation FaultIch würde mich freuen, wenn mir jemand helfen kann!
Viele Grüße,
Patrick
-
Ich glaube du musst die Basisklasse mit virtual signieren und auch so von ihr erben.
Dadurch sollte nur noch ein Basisklassensubobjekt für die abgeleiteten Klassen existieren und der Basepointer kommt auch wieder klar.
-
Nein, das Problem wird wahrscheinlich sein, dass dein Manager Objekt nicht initialisiert ist.
Hauptklasse sollte aber einen virtuellen Destruktor haben.
-
Nein, das Problem wird wahrscheinlich sein, dass dein Manager Objekt nicht initialisiert ist.
Ich hab mich mal eben schlau gemacht. Das mit dem virtuellen erben macht in der Tat keinen Sinn, wenn die Klassenhierarchie so ist, wie oben dargestellt.
Ausgehend von diesem Szenario :
class BasisKlasse; class SubKlasse1 : public BasisKlasse; class Subklasse2 : public Basisklasse; class SubSubClass : public SubKlasse1, public SubKlasse2;Könnte ein pointer vom Typ Basisklasse nicht ohne weiteres auf SubSubClass verweisen, denn es ist einfach nicht klar, welches Basisklassensubobjekt angesprochen werden soll.
Vermutlich hat Mechanics aber Recht.

-
Du wirst aber deinen Manager nicht instanziiert haben.
-
Das Problem ist dass unvollständiger Code gepostet wurde der so nichtmal compiliert.
Was das Problem in dem Code ist mit dem paho92 es wirklich probiert hat, da können wir nur raten.
Vermutlich dass der Manager Zeiger den er vermutlich irgendwo definiert hat nicht oder mit 0 initialisiert wurde.