Komplexen Datentyp in Vector speichern



  • Hi,

    ich versuche einen Vector anzulegen, der als Datentyp eine Klasse "Eingabe" hat und das ganze dynamisch zu speichern. Leider geht das "delete[] Liste" nicht zum Kompilieren, da spuckt der GCC folgende Fehlermeldung aus:
    type ‘class std::vector<Eintrag, std::allocator<Eintrag*> >’ argument given to ‘delete’, expected pointer*

    Mein Quellcode:

    #include <vector>
    using namespace std;
    
    #include "Eingabe.h"
    
    int main()
    {
       vector <Eingabe *> Liste;
       Liste.push_back (new Eingabe());
    
       delete[] Liste;
       Liste.clear();
    }
    

    Hab's auch schon mit:

    delete[] Eingabe();
    

    versucht, leider geht das genauso wenig.

    Wüsste jemand, voran das liegen könnte? Leider bin ich bisher nichts in der Richtung in C++ gemacht und weiß nicht, was in diesem Code falsch wäre.

    Auch schon gegooglet, aber da findet man meistens nur einen Vector mit einfachen Datentypen.



  • Du brauchst die Einträge im vector nicht mit new speichern. Vector übernimmt normalerweise die Speicherverwaltung auf dem HEap.

    #include <vector>
    using namespace std;
    
    #include "Eingabe.h"
    
    int main()
    {
       vector <Eingabe> Liste;
       Liste.push_back (Eingabe());
       Liste.clear();
    }
    


  • Deine Version ist mir auch lieber, nur hat unser Professor gesagt, wir *müssen* mit new Speicherplatz einfordern, argumentiert hat er damit, dass man nicht weiß wieviele Einträge jetzt wirklich angelegt werden (ob 1 oder 100).



  • Dann sag deinem Professor, daß er keine Ahnung von C++ hat - das gute an den Containerklassen ist, daß dir egal sein kann, wieviel Platz du brauchst. Der vector<> zählt mit, wieviele Elemente er eingeliefert bekommt und beschafft sich selber genug Platz dafür.

    PS: Wenn du unbedingt Pointer verwenden willst, mußt du auch jeden angeforderten Block von Hand wieder freigeben:

    for(size_t i=0;i<Liste.size();++i) delete Liste[i];
    


  • @meg! Das hat damit nichts zu tun. Der Vector wächst intern autom. weiter, wenn man mit push_back seine Elemente hinzufügt. Ich bin mir sicher, das er das mit new anders meinte, denn sonst sollte er sich das Thema Vector neu reinlesen. 😉

    Das von THX ist auf jeden Fall richtig und einfacher.

    Das was du machen willst, wenn du die Elemente mit new im Vector anlegen willst, sollte so sein:

    #include <vector>
    #include "Eingabe.h"
    
    using namespace std; // nicht vor einem Include!!!
    
    int main()
    {
       vector <Eingabe *> Liste;
       Liste.push_back (new Eingabe());
    
       for(int i=0; i< Liste.size(); i++)
            delete (Liste[i]);
    
       Liste.clear();
    }
    

    vector<Eingabe*> macht man nur, wenn man polymorphe Typen bzw. unterschiedliche Typen speichern will. Wenn du nur Eingabe-Typen speichern willst, nimmst du das von THX!!!

    Aber mit der Anzahl hat das absolut nichts zu tun!



  • Ist nicht die Frage vielmehr was der Professor will?
    Und ob vector dafür geeignet ist? Evtl. will der Professor ja ein normales Array haben...


Log in to reply