new und Vererbung
-
Guten Morgen.
ich sitze gerade am Speichern/Laden einer verketteten Liste.
class Elem { public: Elem(); ~Elem(); // Save übernehmen das Speichern bzw. Laden // der Basisdaten (Prev,Next,...) bool Save( const char *file ); static Elem *Load( const char *file ); // Die virtuellen Methoden Save und Load // sollen die Daten abgeleiteter Klassen speichern. virtual bool Save( fstream &f ); virtual bool Load( fstream &f ); protected: Elem *m_pPrev; Elem *m_pNext; }Soweit sogut. Das Speichern klappt auch wunderbar. Nur beim Laden habe ich ein Problem.
/*static*/ Elem *Elem::Load( const char *file ) { size_t count = ... fstream f; f.open( file, ...) for ( size_t i = 0; i < count; i++ ) { // An dieser Stelle wollte ich eigendlich das jeweils abgeleitete // Objekt erstellen und nicht ein Basisobjekt. // Damit wird dann natürlich auch "virtual bool Load( fstream &f )" // der Basisklasse aufgerufen. Elem *elem = new Elem(); elem->Load( f ); }; ... };Kann man dieses Problem überhaupt ohne Templates lösen? Irgendwie stehe ich da gerade auf dem Schlauch oder stelle mich zu blöd an
Ein kleiner Denkanstoß würde mir schon reichen. Danke.
-
In der Definition der abgeleiteten Klassen überschreibst du die Load()-Fkt. und kannst innerhalb dieser Überschreibung ggf. die Load()-Fkt. der Basisklasse aufrufen.
-
Elem *elem = new Elem(); elem->Load( f );du lädst die daten in ein neu erzeugtes objekt. was du willst, ist this->Load(f).
aber eigentlich ist deine konstruktion mit zwei Load() und Save()-funktionen nicht sehr sinnvoll. besser, du definierst nur eine Load() und eine Save()-funktion und schreibst in der Load()-funktion der abgeleiteten klasse am anfang this->Elm::Load(), um auch die daten der parent-klasse zu laden (analog für Save()). die Load() und Save()-funktionen müssen dazu nicht unbedingt virtuell sein.