Abstrakte Klasse / Vererbung
-
groovemaster schrieb:
Dh du möchtest eine Kopie des Objektes? Also nicht einfach nur den Zeiger kopieren? Eine Möglichkeit wäre, deine abstrakte Klasse mit einer clone Funktion auszustatten. markus.r's Ansatz wäre natürlich auch ein Weg. Gefällt mir persönlich aber überhaupt nicht, da es relativ unflexibel ist. Und ausserdem bist du dann auf RTTI angewiesen.
Ja, genau, eine Kopie des Objektes. Die Klasse Freizeit ist ja bereits insofern abstrakt, als dass alle ihre Funktionen in der Form
virtual function() = 0;
angegeben, und dann in jeweils Zoo bzw. Schwimmbad ausprogrammiert sind. Wie kann ich nun aber mein gewünschtes Ziel erreichen? Wie gesagt, ich dachte daran, dass eine Variable vom Typ "Freizeit" sowohl den Typ Zoo als auch den Typ Schwimmbad aufnehmen kann.
-
Wie schon gesagt brauchst du einen Pointer auf Freizeit. Du könntest ja sowieso keine einfache Instanz von Freizeit erstellen da diese Klasse ja abstrakt ist.
-
Ich frage mal:
Du willst eine Variable in eine andere Speichern.
Welchen Typ haben die Variablen?
Wenn man zwei verschiedene Variablentypen ineinanderkopieren will, dann überlädt man den Konstruktor um einen Typecast zuzulassen:
Beispiel:
class A { }; class B { B{A a); }; A mein_a; B mein_b; mein_b= mein_a;
Damit sollte eine (auch implizite) Umwandlung von A in B moeglich sein.
-
@design.
Anstatt sich übers Design aufzuregen, sollte man erstmal lernen, richtig zu zitieren.Dass die Bezeichner nicht wirklich zueinander passen, sieht wohl jeder selbst. Vielen Dank dafür, dass das Forum bei mir jetzt rumspinnt. Vielleicht wäre einer der Mods so nett und korrigiert das [ /quote ][ /cpp ] in die richtige Reihenfolge.
CProgger schrieb:
Wie kann ich nun aber mein gewünschtes Ziel erreichen?
OK, nochmal etwas ausführlicher. Erstmal fügst du deiner Basisklasse eine weitere rein virtuelle Funktion hinzu:
class Feizeit { //... virtual auto_ptr<Feizeit> clone() const = 0; //... };
Anschliessend implementierst du clone in jeder Kindklasse:
// Bsp fuer Zoo class Zoo : public Feizeit { //... auto_ptr<Feizeit> clone() const { return auto_ptr<Feizeit>(new Zoo(*this)); } };
Wie du siehst, brauchst du lediglich einen passenden copy ctor.
Und nun die Verwendung:
// it sei ein Iterator deines Listenelementes auto_ptr<Feizeit> meine_kopie = (*it)->clone();
Natürlich kannst du auch einen anderen Smart Pointer verwenden. Oder diesen weglassen und einfach Freizeit* schreiben. Letzteres ist aber nicht empfehlenswert, da dann die Speicherfreigabe manuell gemacht werden muss.
-
Sehr interessant: Hier scheinen Pointer und Templates gemeinsam verwendet zu werden. Das könnte wirklich schicker als meine dynamic_cast-Methode sein.
Gibt's da dazu eine Anleitung?
-
groovemaster, dadurch weiss er aber immer noch nicht, ob die
Variable ein Zoo oder Schwimmbad ist !!!Devil
-
D.h. also, dass die Klassen Zoo, Schwimmbad und Freizeit nicht unterscheidbar sein sollen und die gleichen Daten aufnehmen sollen.
Ich stelle mal die vorlaute Behauptung, dass man in dem Fall nur ein Variablentyp benötigt.
-
markus.r schrieb:
D.h. also, dass die Klassen Zoo, Schwimmbad und Freizeit nicht unterscheidbar sein sollen und die gleichen Daten aufnehmen sollen.
Ich stelle mal die vorlaute Behauptung, dass man in dem Fall nur ein Variablentyp benötigt.
Wenn man keine Ahnung hat
Nein, es heisst lediglich, solange er auf den auto_ptr<FreiZeit> zugreift,
er nur die Methoden eines Freizeit Objektes zur Verfügung hat, bzw. auf
die virtuellen Methoden des Tatsächlichen Objekts (Bad/Zoo) zugreifen kann,
aber nicht auf Zoo::tier_füttern(); oder Bad::schwimmen(). Dazu müsste er dann
den Pointer casten -> dynamic_cast<>Devil
-
Da ich ja keine Ahnung habe, habe ich den Vorschlag mit dynamic_cast<> als 1. Anwort auf diesen Thread gemacht.
Damit wären Typen unterscheidbar als auch das indiviuelle Interface des Typs nutzbar.Dies ist jedoch verworfen worden, da das nicht benötigt wurde.
Also bleibt meine Aussage:
Eine Klasse reicht
-
devil81 schrieb:
groovemaster, dadurch weiss er aber immer noch nicht, ob die
Variable ein Zoo oder Schwimmbad ist !!!Das ist zwar richtig, diese Anforderung kann ich der Problembeschreibung aber nicht entnehmen. Der OP wollte ja lediglich das Objekt kopieren, egal ob es nun ein Zoo oder Schwimmbad ist. Und sollte eine objektspezifische Funktionalität erforderlich sein, dann kann man dynamic_cast immer noch auf die Kopie loslassen.
-
markus.r schrieb:
Also bleibt meine Aussage:
Eine Klasse reichtNein eben nicht, denn schwimmbad::eintritt()
könnte anders sein als Zoo::eintritt();
Die Funktionen Unterscheiden sich ja.Devil