Implementationsfrage



  • Hallo zusammen,

    ich habe eine Basisklasse für eine verkettete Baumstruktur geschrieben. Diese verfügt bisher über eine statische Methode zum zerstören der kompletten Baumstruktur einschließlich aller Elemente. Soweit sogut 🙂

    Zu einem Problem kommt erst wenn diese Methode von einer abgeleiteten Klasse gerufen wird, da hier lediglich der Destruktur der Basisklasse beim Zerstören des Baums gerufen wird. Also habe ich das ganze durch eine Template-Methode ausgetauscht.

    template<class T> static bool Free( node *p )
    {
      if ( pNode )
      {
        T *pNode = (T*)p;
    
        while ( pNode )
        {
          T *pNext = (T*)pNode->TraverseNext();
          delete pNode;
          pNode = pNext;
        };
    
        return true;
      };
    
      return false;
    };
    

    Meine Frage jetzt: Würdet ihr das auch so implementieren oder gibt es da eine bessere/elegantere Möglichkeit? Danke.



  • Hast Du möglicherweise vergessen den Destructor virtuell zu machen? Zumindest ist er der gezeigten Routine egal, ob sie als statisches Member oder als freie Funktion irgendwo existiert.

    Zu der Routine:
    Wozu genau soll das Template gut sein?
    Der erst Cast zeigt doch, dass Node* und T* kompatibel sein müssen, also vermutlich T eine von Node abgeleitete Klasse sein soll. Da ist ein Template nicht notwendig (virtuelle Destruktoren).

    Warum gibt die Routine true oder false zurück? Was willst Du dem Aufrufer damit sagen? Erscheint mir nicht sinnvoll.



  • Herrmann schrieb:

    template<class T> static bool Free( node *p )
    {
      if ( pNode )
      {
        T *pNode = (T*)p;
    
        //..
      };
    
      return false;
    };
    

    Wie kannst auf pNode prüfen, wo du es noch nicht initialisiert hast? 😕



  • Herrmann schrieb:

    Meine Frage jetzt: Würdet ihr das auch so implementieren

    Nein.

    Herrmann schrieb:

    oder gibt es da eine bessere/elegantere Möglichkeit? Danke.

    Wie bereits gesagt wurde, virtueller dtor ist ein gutes Stichwort.

    btw:
    Warum eine statische Funktion 'Free(node)' und keine Memberfunktion 'Free()'?



  • Meine Frage jetzt: Würdet ihr das auch so implementieren

    Nein dein Programmierstil ist grauenhaft.



  • virtuelle Destruktoren - das ist es. Wieso denke ich immer so kompliziert 🤡 Danke.

    EDIT: @don_basto, das war nur ein Tippfehler. Es sollte nur der Eingangszeiger überprüft werden.

    EDIT: @groovemaster, deine Frage bezüglich der statische Methode ist schon berechtigt: Werde ich ändern 🙂


Anmelden zum Antworten