anfänger-frage polymorphismus
-
Hallo,
ich möchte eine Datenstuktur liste selbst schreiben und suche nach einer möglichkeit dieser Klasse eine funktion zu übergeben, so dass diese funktion
für jedes Element der Liste ausgeführt wird.Nochmal ausführlicher:
ich habe:class Liste{ Node *next; Node *prev; }und könnte dieser Klasse jetzt natürlich für jede Aufgabe eine Funktion hinzufügen: void forEachPrint(), void forEachPlus1(), forEachSquare(), usw, usw,
das scheint mir aber blöd.ich hätte gerne eine Funktion die so aussieht:
void do( hier übergebe ich funktion f) { f(this); next->do(f) }wie geht das und kann ich im netz eine ausführliche erklärung dazu finden?
Liebe Grüße,
Raphael
-
Schau dir mal die Dokumentation von std::foreach() an - die macht etwas ähnliches mit STL-konformen Containern (bzw. Iteratoren).
-
#include <iostream> #include <list> using namespace std; template <typename T> class Liste { list<T> m_list; public: Liste() { m_list.push_back(22); m_list.push_back(41); m_list.push_back(18); } template<typename TAktion> void machBeiJedem(TAktion aktion) { for(list<T>::iterator iter = m_list.begin(); iter!=m_list.end(); ++iter) aktion(*iter); } }; void ausgabe(int i) { cout << i << endl; } void einsMehr(int &i) { ++i; } int main() { Liste<int> eineListe; eineListe.machBeiJedem(einsMehr); eineListe.machBeiJedem(ausgabe); cin.get(); }
-
manche Compiler bestehen auf typename bei list<T>::iterator
template<typename TAktion> void machBeiJedem(TAktion aktion) { for(typename list<T>::iterator iter = m_list.begin(); iter!=m_list.end(); ++iter) aktion(*iter); }
-
Vielen Dank, genau das habe ich gesucht!