Call by Referenc mit this als Referenc
-
Hi,
Ich da mal eine Frage. Ich würde gerne per Call by Reference einen Pointer auf aufgerufen Instanz selbst zurück geben:
class DemoClass { public: DemoClass(); int x; void setParam(const DemoClass ¶m){ param=this; } }; int main(int argc, char *argv[]) { DemoClass *test1,*test2; test1->x=1; test2->x=2; test1->setParam(*test2); qDebug() << test1->x; qDebug() << test2->x; };Geht das? Ich bekomme z.B. folgende Fehlermeldung:
`F:\Programmieren\Detection\main.cpp:28: Fehler: C2678: Bin„rer Operator '=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const DemoClass' akzeptiert (oder keine geeignete Konvertierung m”glich)....\Detection\main.cpp(30): kann 'DemoClass &DemoClass::operator =(const DemoClass &)' sein
bei Anpassung der Argumentliste '(const DemoClass, DemoClass *)'`
-
param ist eine const-Referenz.
-
Was willst du genau machen? Deine Beschreibung und der Code wiedersprechen sich.
param ist const, daher kannst du ihm nichts zuweisen.
this is ein Pointer, mit *this kriegst du eine Referenz auf das aktuelle Objekt.
-
Ja, sorry. Hab das "const" noch aus einem Versuch vergessen:
class DemoClass { public: DemoClass(); int x; void setParam(DemoClass ¶m){ param=*this; } }; int main(int argc, char *argv[]) { DemoClass *test1,*test2; test1->x=1; test2->x=2; test1->setParam(*test2); qDebug() << test1->x; test1->x=99; qDebug() << test2->x; };Ich würde erwarten (hoffen), dass bei der zweiten Ausgabe "99" ausgegeben wird. Wird so klarer was ich meine?
-
In Zeile 7 weist du param eine Kopie des aktuellen Objekts zu. param ist eine Referenz auf den Wert des (uninitialisierten!) Zeigers test2.
Das weißt nicht dem (uninitalisierten!) Zeiger eine neue Adresse zu, dazu musst du wirklich Zeiger verwenden.
-
O.k. Das mit den unitialisierten Zeigern ist sicher schon mal ein Fehler:-)
class DemoClass { public: DemoClass(); int x; void setParam(DemoClass ¶m); }; DemoClass::DemoClass() { } void DemoClass::setParam(DemoClass ¶m) { param=*this; } int main(int argc, char *argv[]) { DemoClass *test1 = new DemoClass(); DemoClass *test2 = new DemoClass(); test1->x=1; test2->x=2; test1->setParam(*test2); qDebug() << test1->x; test1->x=99; qDebug() << test2->x; }Aber könntest du mir das mit den
dazu musst du wirklich Zeiger verwenden
etwas näher erklären. Ich bin äußerst Schwach auf der Brust was Pointer betrifft.
Vielen Dank im Vorraus (und auch für die bisherigen Antworten).
-
flambert schrieb:
O.k. Das mit den unitialisierten Zeigern ist sicher schon mal ein Fehler:-)
class DemoClass { public: DemoClass(); int x; void setParam(DemoClass ¶m); }; DemoClass::DemoClass() { } void DemoClass::setParam(DemoClass ¶m) { param=*this; } int main(int argc, char *argv[]) { DemoClass *test1 = new DemoClass(); DemoClass *test2 = new DemoClass(); test1->x=1; test2->x=2; test1->setParam(*test2); qDebug() << test1->x; test1->x=99; qDebug() << test2->x; }Aber könntest du mir das mit den
dazu musst du wirklich Zeiger verwenden
etwas näher erklären. Ich bin äußerst Schwach auf der Brust was Pointer betrifft.
Wieso verwendest du dann Pointer, wenns unnötig ist (für die beiden Objekte)?
Hier, ich zeigs dir:class DemoClass { public: DemoClass(); int x; void setParam(DemoClass* ¶m); // wir nehmen einen Pointer by Reference }; DemoClass::DemoClass() { } void DemoClass::setParam(DemoClass* ¶m) { param=this; // und lassen den auf this zeigen } int main(int argc, char *argv[]) { //DemoClass *test1 = new DemoClass(); DemoClass test1; // kein new! test1->x=1; DemoClass *test2; // Pointer auf DemoClass test1.setParam(test2); // lassen wir auf test1 zeigen qDebug() << test1->x; test1->x=99; qDebug() << test2->x; }Wobei dafür eine Memberfunktion überflüssig ist, schließlich kann man auch direkt
DemoClass* test2 = &test1;schreiben.
Vielen Dank im v****** (und auch für die bisherigen Antworten).
Es heißt Voraus. Ein R.
-
Tausend Dank. Ich war schon am Verzweifeln.
Wobei dafür eine Memberfunktion überflüssig ist
Ist nur ein minimal Beispiel. In meinem Programm durchsuche ich einen Suchbaum und würde das Ergebnis (nach ein paar hundert Zweigen) eben gerne auf diese Weise zurück geben.
Herzlichsten Dank!
-
Nur mal so als Tipp: das nächste mal, wenn Du Code und eine Fehlermeldung zeigst, sollte die Fehlermeldung zum Code passen. Deine Fehlermeldung bezieht sich auf Zeile 28, der Code hat allerdings nur 22 Zeilen. Ich wundere mich, dass andere sich da noch Mühe geben, Dir zu helfen, wenn Du Dir so wenig Mühe gibst.