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.


Anmelden zum Antworten