Iterator als Klassen-variable



  • hallo Leute
    ich hab hier folgendes Prob. und bin auch nach längerem suchen immer noch nicht weitergekommen. Hier erstmal ne kleine Progversion meines Problems:

    using namespace std;
    
    #include <iostream>
    #include <list>
    #include <vector>
    #include <iterator>
    
    template <class T>
    class element{
    protected:
      list<T> neueliste;
      //list<T>::iterator pos; //warnig-Meldung
      //wie muss hier die Syntax aussehen um den Iterator für das Objekt global zu erzeugen?
    public:
      element();
      element(list<T>entrylist) : neueliste(entrylist){
      };
    
      T get_next(){
        //bei Aufruf der get_next()- Funktion wird hier der Iterator nur lokal          
        //aufgerufen: zählt also nur innerhalb der Funktion:
        list<int>::iterator pos = neueliste.begin();  
        advance(pos, 1);
        return *pos-1;
      };
    };
    
    int main(){
      list <int> test;
      for (int i=0 ; i<10 ; i++)
        test.push_back(i);
    
      element<int> neuesEle(test);
      for (int i=0; i<10 ; i++)
        cout<<neuesEle.get_next()<<endl;
    
      return 0;
    };
    

    Ich will also in meiner Klasse element eine Liste verwalten. Der Konstruktor soll das Feld initialisieren (tut er) und gleichzeitig einen Iterator erzeugen und diesen auf das Anfangselement setzen (tut er nicht)
    Die Zugriffsfunktion get_next() soll "einfach" das nächste Element zurückgeben.

    Leider will das so nicht. Was mach ich falsch und wie muss das richtig lauten?
    MERCI!!!

    😕

    [ Dieser Beitrag wurde am 28.04.2003 um 16:59 Uhr von Dimah editiert. ]



  • ich würde sagen
    typename list<T>::iterator Iterator;

    aber es wäre hilfreich wenn du die warnung auch posten würdest.



  • OT: Ihhh denglish bitte, verwend english durchgehend (mal kommentare von abgesehen). 😉



  • jaja gut ich werde dann mal alles verenglischen.. 🙄
    aber wenn es nicht läuft bringt nicht mal das was 😉
    wenn ich die Zeile:

    list<T>::iterator pos; //warnig-Meldung
    

    einfüge und im Konstruktor nur

    pos = neueliste.begin();
    

    statt

    list<int>::iterator pos = neueliste.begin();
    

    schreibe kommt folgendes Warning:

    arbeit12.cpp:13: warning: `std::list<T, std::allocator<_CharT> >::iterator' is
    implicitly a typename
    arbeit12.cpp:13: warning: implicit typename is deprecated, please see the
    documentation for details

    und vorallem wird bei der Funktion get_next() nur die Position 0 ausgegeben.

    😕



  • ach ja und:
    mit typname bekomme ich immerhin kein Warning mehr, jedoch bei der Ausgabe zählt der Iterator immer noch nicht weiter. 😕



  • typename list<T>::iterator pos;
    

    list<T>::iterator ist ein von T abhängiger Typ, daher darf der Compiler zwar von sich aus wissen, dass es sich um einen Typen handelt, er muß es aber lt. Standard nicht, und sagt dir, dass du ihm das eigentlich per 'typename' anzeigen solltest. Andere Compiler sind vielleicht nicht so gnädig.



  • Erstmal finde ich get_next() ist ein schlecht gewählter name für eine Funktion, die immer das zweite Element der Liste ausgibt. Und List hat einen Operator ++, den du verwenden kannst statt std::advance(foo, 1); ich glaube das wäre übersichtlicher. Und ist dir bewust, dass du den wert des Zweiten Elements immer um eins vermindert ausgibst (vorausgesetzt T ist ein Standardtyp).


Anmelden zum Antworten