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!


Anmelden zum Antworten