Frage zu einem Konstrukt



  • Nabend die Gemeinde,

    folgendes Konstrukt liegt vor

    Tracer::~Tracer()
    {
        std::vector<Tracer*>::iterator pos = tracervec.begin();
    
        while(pos != tracervec.end() && *pos != this)
        {
            ++pos;
        }
        if(pos == tracervec.end())
        {
            tracedatei <<"Abbruch! 'delete' auf nicht-existentes Objekt"<<std::endl;
            tracedatei.close();
            exit(2);
        }
    
    ... //Stark vereinfacht
    }
    

    meine FRage bezieht sich auf diese Zeile

    while(pos != tracervec.end() && *pos != this)
    

    Wieso kann ich hier einen Derefernzierten Iterator mit einem Obejekt vergleichen? Warum muss es nicht

    pos != this
    

    heißen?
    Den Code habe ich Teilweise aus meinem Buch(Ulrich Breymann)

    Kann mir einer auf die Sprünge helfen?



  • std::vector<Tracer*>::iterator pos = tracervec.begin();
    

    pos ist ein iterator, der auf einen vektor aus Tracer* zeigt. Wenn du den iterator dann dereferenzierst, kommst du an den Inhalt, wo der iterator drauf zeigt, also Tracer*. Das kannst du dann auch mit this vergleichen 😉



  • achso stimmt ja, ist ja ein Tracer* und kein normaler Tracer. Alles klar das sollte das Problem klären.



  • Heißt das wenn ich anstatt

    std::vector<Tracer*>::iterator pos = tracervec.begin();
    

    das hier schreiben

    std::vector<Tracer>::iterator pos = tracervec.begin();
    

    könnte/müsste ich so vergleichen

    while(pos != tracervec.end() && pos != this)
        {
            ++pos;
        }
    

    ??



  • Nein das geht nicht, weil dann Kopien in dem vector gespeichert werden.
    Müßte dann

    *this != *pos
    

    heißen.
    Dann werden die Inhalte verglichen mit dem != operator der Klasse Tracer (sofern vorhanden, sonst gibt es einen compiler Fehler)



  • Nein, pos ist weiterhin der Iterator, den brauchst du mit nichts zu vergleichen. Das Objekt ist diesmal nur Tracer und nicht Tracer*. Da this aber Tracer* ist, müsstest du so vergleichen, in dem du this (Tracer*) auf *this (Tracer) dereferenzierst:

    while(pos != tracervec.end() && pos != *this)
    

    Edit: Mist, zu spät. 😃


Anmelden zum Antworten