eigenen iterator erstellen



  • Hallo Zusammen,

    ich will eine eigene Queueklasse erstellen, welche sich beim einfügen automatisch nach bestimmten Angaben sortiert. für die Sortierung will ich algorithm/sort verwenden, wofür ich aber einen eigen Iterator Implementierung brauche. Da habe ich aber Probleme. Insbesondere geht folgender Aufruf nicht:

    LTQueue::iterator it = queue->begin();
        while(it != queue->end()){
            std::cout << it <<std::endl;
            it++;
        }//End while
    [/code]
    
    Der Fehler lautet:
    

    error: no match for ‘operator<<’ in ‘std::cout << it’
    [/code]
    Meine Klassen in Kurzform:

    class LTNode {
    public:
        LTNode();
        LTNode(bool deliverable, int sequ, int nodeId, int lt, int pdu);
        LTNode(const LTNode& orig);
    ...
        void setNextNode(LTNode* next);
        LTNode* getNextNode() const;
        void setPreviousNode(LTNode* prev);
        LTNode* getPreviousNode() const;
    private:
        bool deliverable;
        int sequ;
        int nodeId;
        int lt;
        int pdu;
    
        LTNode *prev;
        LTNode *next;
    
    };
    
    class LTQueue {
    public:
        LTQueue();
        virtual ~LTQueue();
        bool enqueue(LTNode* node);
        bool enqueue(bool deliverable, int nodeId, int sequ, int lt, int pdu);
        void dequeue();
        LTNode* find(int nodeId, int sequ);
        LTNode* top();
        void clearList();
        void updateLT(int nodeId, int sequ);
        void updateDeleverable(int nodeId, int sequ);
    
        // Oeffentliche Iteratorklasse
        class iterator {
        private:
            // Zeiger auf aktuelles Element
            LTNode* current;
        public:
            iterator(LTNode* elem = 0);
            ~iterator(void);
            iterator(const iterator& it);
            iterator & operator=(const iterator it);
            bool operator==(const iterator& it);
            bool operator!=(const iterator& it);
            LTNode& operator*(void) const;
            iterator & operator++(void);
            iterator operator++(int dummy);
        };
    
        iterator begin(void);
        iterator end(void);
    private:
        void sortList();
        LTNode* first;
        LTNode* last;
    };
    

    Ich gehe mal davon aus, dass ich bei der Definition der Iteratorklasse etwas falsch gemacht habe, bzw. es nicht ganz verstanden habe. Jemand nen Tipp? Vielen Dank.

    mfg, uwe



  • Wenn du die tatsächlichen Werte der Queue ausgeben willst, musst du, wie beu Zeigern auch, sie derefferenzieren (der refferenzierte Typ sollte dann aber eine Überladung für operator<< besitzten).

    LTQueue::iterator it = queue->begin();
    while(it != queue->end()){
    std::cout << *it <<std::endl; // sollte klappen (je nach Typ der Queue)
    it++;
    }//End while
    

    Den Derefferenzierungsoperator musst du selbstverständlich selber implementieren (ließ überladen).



  • Hi,

    also ich will das aktuelle Element in der Queue ausgeben. Wenn ich auf einzelnen Elemente dieses Objektes zugreifen will, über "it->" bekomme ich in der IDE nur eine Liste mit einzelnen Operatorfunktionen aufgezeigt. Wenn ich direkt dereferenziere über "(*it)" kann ich zwar auf die einzelnen Funktionen zugreifen, aber ich bekomme immer dann folgenden Fehler:

    error: no match for ‘operator<<’ in ‘std::cout << it.LTQueue::iterator::operator*()’
    

    Allerdings gibt es aber in LTNode die folgende Methode:

    std::ostream & operator<<(std::ostream& stream, const LTNode& node) {
        return stream << "nodeID: " << node.getNodeID() << " "
                << "lt: " << node.getLT() << " "
                << "sequ: " << node.getSequ() << " "
                << "deliverable: " << node.isDeliverable() << "\n";
    }
    

    Wo ist mein Gedankenfehler? Danke!
    uwe


Anmelden zum Antworten