vererbungsproblem
-
hi,
ich denke mal, das gabs hier schon öfter, aber versuche es trotzdem:
ich habe eine basisklasse (B), in der eine methode m() implementiert ist.
dann kommen haufenweise klassen, die von B abgeleitet sind, und u.a. m() neu implementieren.
wie kann ich jetzt die ganzen abgeleiteten klassen in eine liste (oder von mir aus eine zeigerliste) speichern, um dann für alle m() hintereinander aufzurufen?
-
/* m ist virtual */ struct callm { void operator()(Base* b){b->m();} }; struct del { void operator()(Base* b){delete b;} }; /* irgendwo anders */ std::list<Base*> mybaselist; mybaselist.push_back(new Child()); //Child ist von Base abgeleitet. /* noch mehr in die Liste einfügen */ /* ... */ /* m aufrufen */ std::for_each(mybaselist.begin(),mybaselist.end(),callm()); /* und jetzt löschen wir die ganze liste auf einmal */ std::for_each(mybaselist.begin(),mybaselist.end(),del()); mybaselist.clear();//Pointer auch wieder löschen...
-
aha, ok, danke, alles klar.
struct del { void operator()(Base* b){delete b;} // <= aber was genau bedeutet das in der mittleren klammer? };heißt das, dass man
Base *a=new Base; del()(a);schreiben kann?
-
Nein, del ist objekt und keine Funktion.
Korrekt wäre es so:Base* b = new Base(); del d; d(b);//aufruf des op()Beachte bitte das von Abgeleiteten Klassen
der Konstruktor virtual sein sollte, und
das wenn du die Liste mit std::for_each und del() löschst,
auch alle elemente der Liste mit new erstellt sein sollten.
Und danach nicht mehr gebraucht werden...