maps



  • Ja, innerhalb dessen musst Du die einzelnen Elemente in der map per delete löschen, weil Du sie mit new erzeugst.

    edit: typo



  • Ja, genau - das ist die (vermutlich) richtige Stelle, um den Speicher wieder freizugeben:

    for(map<int,Tier*>::iterator pos=tiere->begin();pos!=tiere->end();++pos)
      delete pos->second;
    delete tiere;
    


  • oh man, ich hasse es.. immer copy &paste aber keine ahnung worum es geht, warum können wir net einfach nen hello world programms chreiben.. ttzzz ^^... neein.. wir fangen direktt so an..

    nungut.. also ihc muss ja jetzt nen tier zufügen die nummer soll aber automatich vergeben werden, darum hatte ich das tiernummer++ aber wo muss ich denn angeben bei welcher nummer der anfängt? weil direkt in der methode steht ja

    int	tierNummer;
    

    naja und wenn ihc das dann hab muss ich ne übersicht mir ausgeben lassen von allen tieren. da hab ich schon was ausm buch aber wirklich verstehn tu ichs net

    for (map<int, Tier* >::iterator iter = tiere->begin(); iter!=tiere->end(); ++iter){
    			//tiere werden sortiert nach dem namen ausgegeben
                             cout << iter->first;
    			iter->second->drukaf();
    		}
    


  • MiMi85 schrieb:

    oh man, ich hasse es.. immer copy &paste aber keine ahnung worum es geht, warum können wir net einfach nen hello world programms chreiben.. ttzzz ^^... neein.. wir fangen direktt so an..

    nungut.. also ihc muss ja jetzt nen tier zufügen die nummer soll aber automatich vergeben werden, darum hatte ich das tiernummer++ aber wo muss ich denn angeben bei welcher nummer der anfängt? weil direkt in der methode steht ja

    int	tierNummer;
    

    Am besten gibst du den Startwert gleich hier an als int tierNummer=1;

    naja und wenn ihc das dann hab muss ich ne übersicht mir ausgeben lassen von allen tieren. da hab ich schon was ausm buch aber wirklich verstehn tu ichs net

    for (map<int, Tier* >::iterator iter = tiere->begin(); iter!=tiere->end(); ++iter){
    			//tiere werden sortiert nach dem namen ausgegeben
                             cout << iter->first;
    			iter->second->drukaf();
    		}
    

    Ein Iterator ist sowas ähnliches wie ein Zeiger (nur daß er die Struktur der unterliegenden Daten kennt), mit begin() und end() holst du dir den Startpunkt und Endpunkt der map. Also kannst du dir die Schleife so vorstellen, daß 'iter' nacheinander auf die einzelnen Map-Elemente zeigt (jedes ist ein pair<const int,Tier*>, also kannst du über iter->first und iter->second die beiden Teile des Elements ansprechen.



  • naja danke erstma für deine hilfe, mein eclipse spinnt gerade rum, will net mehr starten 😞 scheiss windoof macht nur probleme beim programmiern, naja ich werd ma versuchen das zu fixen und später nochma mich dran setzen

    mimi



  • Hi,

    von mir mal ein kleiner Tipp:

    MiMi85 schrieb:

    ...

    map<int, Tier *> * tiere;
    

    Ich würde fast wetten, dass es ein

    map<int, Tier *> tiere;
    

    besser täte. Kommt doch eher selten vor, dass man Container (mit Pointern drin) auf dem Heap braucht.
    Damit ersparst Du Dir schonmal eine Pointerebene.

    Wenn Tier bei Dir nicht Basisklasse ist, kannst Du Dir sogar das schenken und wirst mit

    map<int, Tier> tiere;
    

    noch glücklicher (Zweitere Möglichkeit halte ich aber für unwahrscheinlcher - das Ganze klingt nach "Übungsaufgabe Vererbung" 😉 ).

    Gruß,

    Simon2.



  • Ich weiß gar nicht, warum sich alle immer darüber aufregen, wie C++ in deren Schule belernt wird. Ich wäre froh, wenn es bei uns C++ als Stoffgebiet geben würde, aber nein, wir müssen uns mit Prolog einen abbrechen...

    Mfg Ominion



  • Hi,

    (falls ich gemeint sein sollte) sorry, ich habe das überhaupt nicht abwertend gemeint !
    An dem obigen Ansatz kann ich überhaupt keine pädagogische Fehlkonzeption entdecken ...

    WENN mich etwas aufregt, dann, dass Anfänger in char*-Orgien gehetzt werden, statt ihnen string zu zeigen (oder die erste Aufgabe ist, std::vector nachzuprogrammieren 🙄 ). (hier wird das ja im Gegenteil offensichtlich NICHT gemacht)

    Gruß,

    Simon2.



  • Nein, das war nicht auf dich bezogen. Bloß mir fällt das im allgemeinen so auf. Und mit char * ist eigentlich nur in einer Hinsicht verständlich, nähmlich das der Lehrer irgendwann auf die WinAPI hinaus will, wo man string ja nicht benutzen kann --> das glaube ich allerdings nicht, da das dann so ca 2 Schuljahre dauern würde, bis er dort ist.

    Mfg Ominion



  • naja ich studier informatik in holland. haben im erstne jahr java gemacht und nun c++, ist schon ne umstellung. und

    map<int, Tier *> * tiere;
    

    muss so bleiben, ist vorgegeben ^^ und später kommt noch nen container dazu, für jede tiersote einen .. oder so ähnlich

    thx mimi



  • Ominion schrieb:

    ...Und mit char * ist eigentlich nur in einer Hinsicht verständlich, nähmlich das der Lehrer irgendwann auf die WinAPI hinaus will, wo man string ja nicht benutzen kann ...

    Erstens halte ich es für EXTREM unwahrscheinlich, dass Informatiklehrer/-dozenten ihre Programmieranfänger üblicherweise ins WinAPI-Dickicht schicken wollen.

    Zweitens: Was spricht gegen string::c_str() ? Bloß weil man ab&an einen Standardwrapper (eigentlich immer denselben) für eine bestimmte API nutzen muss, soll jeder mir Pointerarithmetik, Nullterminierung & Co rumärgern ?

    Ich glaube, dass die char*-Fixierung eher daher kommt, das da ein paar alte C-Hasen sih "mal eben ein wenig C++ angesehen haben" und nun meinen, vor einen Kurs treten zu können.

    Gruß,

    Simon2.



  • MiMi85 schrieb:

    ...

    map<int, Tier *> * tiere;
    

    muss so bleiben, ist vorgegeben ...

    😮 😮
    Das spricht dafür, dass der Dozent auch keine wirkliche Ahnung hat (umgeschulter Javaist ? Oder Cler ?)

    Gruß,

    Simon2.


Anmelden zum Antworten