Iteratorelement in Stack speichern



  • Hallo,
    wir haben folgendes Problem:

    Wir haben ein Set in Form eines Binärbaumes.
    In der Begin- Methode soll jeder Pointer auf einen Knoten der schon besucht wurde, mit der push()- Methode auf dem Stack abgelegt werden. Sollte beim Aufruf des ++operators ein Knoten keinen rechten Nachfolger haben, soll durch die pop()- Methode dessen Vorgänger zurückgeliefert werden, damit weiter nach rechts abgestiegen werden kann.
    Die Struktur des Stack sollte soweit funktionieren, das Speichern der Pointer im Stack funktioniert aber nicht.

    Fehlermeldung lautet: Iterator has no member named 's'.

    Auszug aus dem Code:

    template<class T, class OrderClass = DefaultOrder<T> >
    class Set{
    public:
        Set():root(0){}
    
        class Node{
        public:
            Node(T toEnter):content(toEnter),left(0),right(0){}
            Node* left;
            Node* right;
            T content;
        };
    
        class Iterator{
        public:
            Iterator(Node* x):content(x){
                Stack s;
            }
    
            T& operator * (){
                return content->content;
            }
    
            class Stack{
                public:
                    class StackNode{
                        public:
                            StackNode(Node* inContent, StackNode* inNext):content(inContent),next(inNext){}
                        private:
                            Node* content;
                            StackNode* next;
                    };
    
                    Stack():head(0){}
    
                    ~Stack(){delete head;}
    
                    void push(Node* inPtr){
                        if(head == 0)head = new StackNode(inPtr,0);
                        else head = new StackNode(inPtr, head);
                    }
    
                    Node* pop(){
                        if(head == 0) return 0;
                        else{
                            StackNode* toDelete = head;
                            Node* back = head->content;
                            head = toDelete->next;
                            delete toDelete;
                            return back;
                        }    
                    }
                private:
                    Node* head;
            };
    
            private:
                Node* content;
        };          
    
        void insert(T toEnter){
            if(!search(toEnter)){
                Node** tmp = &root;
                while(*tmp != 0){
                    order(toEnter, (*tmp)->content) ? tmp = &(*tmp)->left : tmp = &(*tmp)->right;
                }
                *tmp = new Node(toEnter);
            }
        }    
    
            Iterator begin(){
                Iterator toSend(0);
                toSend.s.push(0);
                Node** tmp = &root;
                if((*tmp)->left != 0){
                    while((*tmp)->left != 0)
                        tmp = &(*tmp)->left;
    //                Iterator toSend(tmp);
                    return toSend;
                }
            }
    
    private:
        Node* root;    
    };
    


  • Iterator(Node* x):content(x){
                Stack s;
            }
    

    s ist doch eine lokale Variable innerhalb einer Funktion ⚠



  • Das ist wohl war, hab ich auch mitlerweile erkannt und dynamisch alloziert.
    Trotzdem bin ich nicht weiter gekommen.
    Aber danke fürs durchsehen.


Anmelden zum Antworten