Eigener Iterator für eigene Liste



  • Hallo,

    es geht im wesentlichen um den Iterator. Alles funktioniert, allerdings ist da diese Unbequemlichkeit mit dem Dereferenzoperator. Aber erstmal die Klasse:

    class Iterator {
    	public:
    		Iterator(); 
    		Iterator(const Iterator& rhs);
    		Iterator(Node* rhs);
    
    		const Iterator& operator++();
    		Iterator operator++(int); 
    		const Iterator& operator--();
    		Iterator operator--(int); 
    
    		bool operator==(const Iterator& rhs) const;
    		bool operator!=(const Iterator& rhs) const;
    
    		T* operator*() const;
    		//?? operator->() const;
    	private:
    		Node* m_position;
    );
    };
    

    Also der Typ, auf den der Iterator "zeigt", ist ein Pointer auf Node (das Element m_position).
    Die Verwendung sieht so aus:

    List::Iterator iter = eineListe.begin();
    while(iter != eineListe.end()) {
        //sehr unbequemer Zugriff:
        (*iter)->doSomething();
        ++iter;
    }
    

    Der List::Iterator::operator*() gibt einfach nur m_position zurück, sodass im Grunde m_position->doSomething() dort steht. Wegen dem Vorrang der Operatoren, muss ich *iter erstmal einklammern, damit es funktioniert.

    Bei der Liste aus der STL habe ich bemerkt, dass das Einklammern gar nicht nötig ist. Vielleicht liegt das an dem operator->()? Wie kann ich den überladen.



  • Ich wuerde folgende beiden Methoden implementieren:

    T & operator*() const;
    T * operator->() const;



  • Wie würde die Implementation für operator->() aussehn?



  • problem. schrieb:

    Wie würde die Implementation für operator->() aussehn?

    T & operator*() const
    {
       return m_position->_item;
    }
    
    T * operator->() const
    {
       return &(m_position->_item);
    }
    


  • Danke, hat gekoappt!


Anmelden zum Antworten