Iteratoren - Stack als Klassentemplate - die zweite



  • ja okay, is wohl kürzer, werds mal noch ändern.

    aber die push funktion funktioniert zumindestens und das programm beendet sich nicht selbst. leider habe ich exceptions noch nicht wirklich behandelt, daher kann ich nicht nachvollziehen was da jetzt falsch sein sollte etc. muss mich da selber erst einarbeiten

    Probe-Nutzer schrieb:

    ex.aveal schrieb:

    nicht überflüssig, sonst wird das element auf den der stack_pointer gezeigt hat nicht entfernt

    Doch, ist wirklich unnötig hier auf NULL zu setzen, noch hinzu kommt, dass temp als lokale Variable sowieso nach dem Ende des Gültigkeitsbereichs nicht mehr zur Verfügung steht.

    MfG,

    Probe-Nutzer

    der erste datensatz bleibt laut meinem prof sonst im speicher und wird erst bei programmende wieder freigegeben. aufdauer würde es sonst eben zum absturz kommen. temp == NULL zu setzen ist nicht zwingend nötig, aber "guter programmier stil" ... wieder laut prof.

    aber trotzdem danke nochmal an alle für die hilfe



  • ex.aveal schrieb:

    temp == NULL zu setzen ist nicht zwingend nötig, aber "guter programmier stil" ... wieder laut prof.

    Dein Prof ist vielleicht ein guter Theoretiker, aber danach hört es auf. Lokale Variablen die nicht mehr verwendet werden (oder auch Membervariablen die nicht mehr verwendet werden) brauchen nicht extra eine Sonderbehandlung.

    Besonders schön sind solche unnötigen Codekonstrukte (wo ein "delete zeiger" ausgereicht hätte):

    Klassenname::~Klassenname()
    {
      if(!zeiger)
      {
        delete zeiger;
        zeiger = 0;
      }
    }
    

    So im realen Projekt vorhanden. Und was Programmierstil angeht: Code soll übersichtlich sein, wenn unnötige Zeilen den Code verlängern reduziert dies ebenso die Lesbarkeit wie schlechtes Einrücken.

    cu André



  • ex.aveal schrieb:

    aber die push funktion funktioniert zumindestens und das programm beendet sich nicht selbst.

    Ja, damit sich das Programm beendet, muss auch das allokieren des Speichers fehlschlagen. Vermutlich hast Du diese Situation einfach noch nicht erreicht.

    Der Punkt ist aber, dass Dein Programm niemals, also auch nicht wenn die Allokation schiefgeht, einen StackError auslösen kann. Denn diese Form von new liefert niemals NULL als Ergebnis.



  • LordJaxom schrieb:

    Denn diese Form von new liefert niemals NULL als Ergebnis.

    Doch auf SEHHHR alten Compilern 😉 (VC6 und Co.)

    Vielleicht sollte sich der Dozent vom OP mal mit den C++ Standard auseinander setzen (Nachdem er nun 10 Jahre draußen ist, und der nächste vor der Tür steht).

    cu André



  • und wie würde dann eine lösung des problems aussehen?
    wie und was müßte ich denn dann aufrufen?!



  • Das hier sollte so funktionieren, wie du es dir vorgestellt hast:

    template <class T>
    void Stack<T>::push(const T &element) throw (StackError) {
        try { 
            stack_pointer = new list_el(stack_pointer, element);
        }
        catch (std::bad_alloc) {
            throw StackError("kein Heapspeicher frei!");
        }
    }
    

Anmelden zum Antworten