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 != thisheiß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 != *posheiß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.
