Was bedeutet das?



  • Hallo

    Habe hier einen kleinen Programmschnipsel den ich nicht verstehe!

    typedef std::list<class CHasenfratzCmd *> HasenfratzCmdPtrList;
    typedef std::list<class CHasenfratzCmd *>::iterator HasenfratzCmdPtrListIter;
    

    kann mir einer erklären was da gemacht wird?
    blick das nicht!

    thx sven



  • Da definiert sich einer 2 typen. Einen names HasenfratzCmdPtrList der ein std::list<class CHasenfratzCmd *> ist und einen names HasenfratzCmdPtrListIter der ein std::list<class CHasenfratzCmd *>::iterator ist.



  • HasenfratzCmdPtrList =
    Eine (STL-)Liste von Pointern auf Objekte vom Typ HasenfratzCmd.
    HasenfratzCmdPtrListIter =
    Ein Iterator für eine Objekt vom Typ HasenfratzCmdPtrList

    Wen dir das alles nichts sagt dann solltest du dich mal mit der STL befassen.



  • hmm
    erstaml danke für die rasche Antwort!
    Was ist STL?
    Und was ist ein Iterator?

    Ich habe in der Klasse ***Doc.h ein

    #include <list>
    

    hat das was damit zu tun?

    wo dann im Mainframe das augerufen wird!

    HasenfratzCmdPtrListIter iter = pDoc->m_listHasentestCmd.begin();
    ..
    ..
    iter != pDoc->m_listHasentestCmd.end()
    

    Die Methoden .beginn bzw .end kann ich in diesem Projekt jedoch nirgens finden
    (das Programm ist komplett lauffähig)

    thx sven



  • Aloha,

    STL = Standard Template Library.
    Mußte googlen, wäre zu umfangreich hier zu erläutern.

    Ein Iterator ist ein Zeiger, mit dem Du Zugriff auf die Elemente in einer Liste hast.

    #include <list> hat richtig damit zu tun. Sie includiert die Klasse, damit Listen nutzbar sind.

    Mit der Klasse werden auch die Methoden begin() und end() includiert.

    Damit kannst Du sie dann auch finden, nämlich in der Klasse list.

    Grüße

    BOA



  • jo super danke

    damit habt ihr mir sehr weiter geholfen!

    sven



  • Und weiter im Text!
    Hab mich nun ein bischen in STL eingelesen

    HasenfratzCmdPtrListIter iter = pDoc->m_listHasentestCmd.begin();
    ..
    ..
    while(iter != pDoc->m_listHasentestCmd.end())
    ..
    

    das ist weitesgehens klar!
    ich besorge mir einen Iterator um auf den Container der auf doppelt verkette Liste beherbert zu zeigen und durchlaufe eine schleife solange bis das Ende dieser erlangt ist! hoffe das das soweit richtig ist!

    Leider hab ich noch ne Frage:

    CHAsenfratzCmd *pCmd = (CHasenfratzCmd *)(*iter);
    

    Ein Pointer auf die Klasse CHasen... und den Iterator oder nur ein Pointer auf den Iterator weil dieser in der Klasse CHasen... erzeugt wurde oder.... ?

    thx a lot

    sven



  • Hallo,

    kurze Erklärung:

    im STL-Container (in diesem Falle in einer std::list) befinden sich irgendwelche Objekte. Um auf die Objekte zuzugreifen, muß erst der Iterator dereferenziert werden:

    (*iter)
    

    da es sich um CHasenfratzCmd-Zeiger handelt, und dieser zugewiesen werden soll, wird noch ein C-Style-Cast:

    (CHasenfratzCmd *)(*iter)
    

    eingesetzt, so daß die Zuweisung zu einem CHasenfratzCmd-Zeiger schließlich so aussieht:

    CHasenfratzCmd *pCmd = (CHasenfratzCmd *)(*iter);
    

    MfG



  • Specialguest schrieb:

    Leider hab ich noch ne Frage:

    CHAsenfratzCmd *pCmd = (CHasenfratzCmd *)(*iter);
    

    Ein Pointer auf die Klasse CHasen... und den Iterator oder nur ein Pointer auf den Iterator weil dieser in der Klasse CHasen... erzeugt wurde oder.... ?

    Aloha,

    ich verstehe die Frage irgendwie nicht... 😕

    Ich traue mich trotzdem mal ran.

    Irgendwann, irgendwo ist per push_back(), push_front(), insert() etc.. mal der Zeiger auf das Objekt CHasenfratzCmd in die Liste aufgenommen worden.

    Dein Zeiger *pCmd zeigt nun auf das Objekt, auf das der Iterator momentan in der Liste zeigt, dementsprechend, bei welchem Element er gerade steht.

    Der Iterator einer Liste ist das Hilfsmittel, um sich in dieser hin und her zu bewegen.

    Grüße

    BOA



  • aha
    also um diesen iterator in dieser Klasse richtig nutzen zu können muss er zuvor noch durch

    C/C++ Code:
    (CHasenfratzCmd *)(*iter)

    gecastet werden um ihn dann letztlich in der Mainframe richtig zu händeln!
    Damit ich innerhalb der einzelnden Einträgen der Liste Sachen machen kann?
    richtig ?

    sven



  • streng genommen ist dieser cast unnötig, denn es geht auch so:

    CHasenfratzCmd *pCmd = *iter;
    

    der cast wurde hier also höchstens zur Verdeutlichung eingesetzt. Es muß also nicht gecastet werden, um das gleiche zu erreichen: mit pCmd zu arbeiten statt mit *iter.

    Man will sich damit nur die umständlichere Schreibweise *iter sparen, um ein einzelnes Objekt aus der Liste anzusprechen, mit pCmd kann man dann "direkt" mit dem Objekt arbeiten (ohne also jedesmal den '*' zur Dereferenzierung einsetzen zu müssen, was bei Arbeit mit dem Iterator nötig wäre)

    MfG



  • Aloha,

    korrekt, mit

    (CHasenfratzCmd*)
    

    castest Du den iterator sozusagen. Und kannst dann mit dem pCmd Zeiger alle member und methoden von dem Objekt benutzen, verändern etc.

    Wie gesagt, die Objekte liegen irgendwo verteilt auf dem Speicher. Die Liste hält diese zusammen, bzw. weiß wo diese liegen.

    Der iterator is der Diener, der bei Bedarf sagt, wo diese liegen, damit Du drauf zugreifen kannst.

    Grüße

    BOA



  • Super danke
    Ihr habt mir das mit der STL und den iteratoren gut nahe gebracht!
    und ich verstehe so einigermaßen was in diesem Programm von statten geht!
    Ich habe ein Programm einer firma bekommen die mit hilfe dieses Programmes einen spezeille Art zur Ansteuerung der RS232 vornimmt! da mein Programm über diese spezielle Verbindung kommunizieren muss, sollte man schnallen was das so gemacht wird! Daher die vielen ???
    Aber ich denke ich komme Schritt für Schritt weiter das alles zu verstehen!
    Also danke erstmal für die super Erklärungen 🙂

    sven


Anmelden zum Antworten