std::vector frage



  • hallo wenn ich einen

    vector <selbsterstellte_klasse*>

    habe, kann ich mit dem auch gleich neue elemente anlegen?

    sowas in der art vector.push_back(new selberstellt) ?

    __________________________________________________________________

    kennt einer eine gute (falls möglich sogar deutschsprachige) seite
    auf der die containerklassen, vielleicht sogar die boost-klassen
    erklärt werden, (auch für anfänger geeignet?)



  • zu 1. japp, das kannst du - warum haste es nicht einfach mal ausprobiert?
    was spricht gegen std::vector <deine_klasse_also_kein_pointer>; ?

    zu 2.
    http://cppreference.com/
    ist englisch und nicht vollständig und beschäftigt sich "nur" mit der STL - aber sollte reichen... ich finds auf jeden fall recht nützlich ^^

    bb



  • gegen kein pointer spricht dass ich slicing vermeiden will da mein vector verschiedene klassen, welche von einer abgeleitet sind, enthalten soll

    🙂
    aber danke



  • np ^^

    aber slicing hat jz nicht so viel mit polymorphie zu tun!?
    du meintest vermutlich das umkopieren der objekt-instanzen?!

    bb 🙂



  • unskilled schrieb:

    aber slicing hat jz nicht so viel mit polymorphie zu tun!?

    Nö, er meint schon Slicing. Der Vektor ist ja für die Basisklasse parametrisiert, es werden aber abgeleitete Objekte reingepackt. Wenn Du das per Wert statt per Zeiger machst, dann wird der Unterklassen-Teil weggeschnippelt.



  • Konrad Rudolph schrieb:

    unskilled schrieb:

    aber slicing hat jz nicht so viel mit polymorphie zu tun!?

    Nö, er meint schon Slicing. Der Vektor ist ja für die Basisklasse parametrisiert, es werden aber abgeleitete Objekte reingepackt. Wenn Du das per Wert statt per Zeiger machst, dann wird der Unterklassen-Teil weggeschnippelt.

    Wieder was dazu gelernt - wusste nicht, dass das mit unter Slicing zählt ^^

    bb


  • Administrator

    ravenheart schrieb:

    hallo wenn ich einen vector<selbsterstellte_klasse*> habe, kann ich mit dem auch gleich neue elemente anlegen? Sowas in der art vector.push_back(new selberstellt) ?

    Naja, was spricht denn dagegen, dass du es so erledigst?

    std::vector<MyClass*> vec;
    
    vec.push_back(new MyDerivedClass);
    vec.push_back(new MyDerivedClass);
    
    // usw.
    

    Du musst einfach nicht vergessen, den Speicher freizugeben. Geht mit Boost übrigens ganz einfach.

    #include <boost/bind.hpp>
    #include <boost/checked_delete.hpp>
    
    #include <algorithm>
    
    // ...
    
    std::for_each(vec.begin(), vec.end(),
                  boost::bind(boost::checked_deleter<MyClass>(), _1));
    

    Oder aber du verwendest gleich die ptr_container von Boost. Diese übernehmen das löschen für dich.

    ravenheart schrieb:

    kennt einer eine gute (falls möglich sogar deutschsprachige) seite auf der die containerklassen, vielleicht sogar die boost-klassen erklärt werden, (auch für anfänger geeignet?)

    Die beste C++ Dokumentation, welche ich kenne, finde man hier:
    http://www.cpluslus.com/reference/

    Für Boost geht man am besten auf die Dokumentationsseite von Boost:
    http://www.boost.org/libs/libraries.htm

    Um das Englisch wirst du beim Programmieren leider nicht herumkommen. Daher möglichst früh lernen, diese Texte zu lesen und zu verstehen.

    Grüssli


Anmelden zum Antworten