gibt es eine möglichkeit oder einen trick mit dem man abstrakte klassen als template parameter für eine der std container angeben kann. Die frage kann man auch anders stellen: Ich such einen container in den ich beliebige abgeleitete klassen einer abstrakten superklasse hinterlegen kann. Gibt es sowas in der std lib? Hat jemand eine Idee?
ich hab vorher versucht das ganze als <KLasse> anstatt <Klasse *> template zu machen. Dabei ruft vector natürlich den standart construktor von Klasse auf und verwendet dann den zuweisungsoperator um den objekt status zu kopieren. Kann ja nicht gehen bei einer abstrakten klasse. Arbeite jetzt mit boost::ptr_vector
Noch eine andere frage: Beim obigen sourcecode, wer übernimmt da die speicherbereinigung die vector klasse?
wenn man std::vector pointer verwalten lässt nimmt er nicht deren ownership an. D.H er erzeugt eine kopie des pointers und löscht diese wenn er gelöscht wird, also sein destruktor aufgerufen wird. => das eigentliche objekt bleibt noch im speicher zurück und es muss per hand gelöscht werden. der boost::ptr_vector nimmt die bürden des besitzes gerne auf sich und löscht das ding dann am ende auch.
Das geht generell nicht, weil die Standardcontainer eine Kopie halten. Dann wird dir ein Objekt der Basisklasse aus einem Objekt der Unterklasse erstellt, und du verlierst alle zusätzlichen Daten der Unterklasse.
Übrigens erzeugt mikes Code ein Speicherloch, weil die auf dem Heap angelegten Objekte nicht wieder freigegeben werden - da muss noch ein
C++:
for(it = vec.begin(); it != vec.end(); ++it) delete *it;
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra
@0xdeadbeef: Najooo Da der Programmfluss eh simple ist kann man das auch dem OS überlassen *g* (99% der aktuellen OS sollten es selber löschen) Sonst geb ich dir recht - boost::shared_ptr würde da auch besser herpassen --