Hallo, ich bin über folgendes Konstruktur gestoßen. Was macht da das &? Beispiel: JsonObject& root = jsonBuffer.createObject(); Quelle: https://github.com/bblanchon/ArduinoJson Ich hab nichts recht gefunden bzw. weiß ich nicht, nach was ich da suchen kann. Lg, Weinga-Unity
Siehe diesen Link: https://stackoverflow.com/questions/35594378/address-of-operator-vs-reference-operator
Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss. Man verwendet es, wenn man Objekte nicht kopieren will oder kann, z.B. bei einer Übergabe an eine Funktion. Aber Vorsicht, die Referenz kontrolliert (in der Regel) nicht die Lebensdauer der Instanz auf die sie zeigt. Wenn die Instanz wegfällt ist ein Zugriff auf die Referenz undefiniert. In deinem Fall zeigt die Referenz auf den Rückgabewert der Funktion. In diesem Fall sorgt der Compiler dafür, dass der Rückgabewert so lange wie die Referenz lebt (reference lifetime extension).
Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine echte Variable hin.
Schei... Code schrieb: > Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine > echte Variable hin. Wenn du auch nur einen Blick in die Doku geworfen hättest, wüsstest du, dass man an dieser Stelle eine Referenz verwenden MUSS.
M.K. B. schrieb: > Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es > ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss. Das ist eher die Sicht des Compilers, der das meist in der Art umsetzt. Als Programmierer ist es eher so gedacht, dass man eine Referenz als einen anderen Namen für ein Objekt ansieht, ähnlich wie ein typedef ein anderer Name für einen Typ ist. > In deinem Fall zeigt die Referenz auf den Rückgabewert der Funktion. In > diesem Fall sorgt der Compiler dafür, dass der Rückgabewert so lange wie > die Referenz lebt (reference lifetime extension). Das gilt aber nur, wenn die Funktion selbst keine Referenz zurückgibt. Schei... Code schrieb: > Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine > echte Variable hin. Wie kommst du darauf, dass das Objekt unbedingt kopiert werden muss statt nur referenziert - oder dass es überhaupt kopiert werden darf?
Rolf M. schrieb: > M.K. B. schrieb: >> Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es >> ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss. > > Das ist eher die Sicht des Compilers, der das meist in der Art umsetzt. > Als Programmierer ist es eher so gedacht, dass man eine Referenz als > einen anderen Namen für ein Objekt ansieht, ähnlich wie ein typedef ein > anderer Name für einen Typ ist. Bei der vermutlich häufigsten Anwendung als Funktionsparameter ist die Referenz durchaus so gedacht, ähnlich wie ein Pointer gesehen zu werden. Oliver
Standard c ist das nicht! Normal steht das & vor der Variable und gibt deren Adresse zurück. Pointer werden mit * deklariert! Weinga U. schrieb: > JsonObject& root = jsonBuffer.createObject(); "JsonObject&" das ist einfach der Name ;)
Wobei mir das: Weinga U. schrieb: > JsonObject& root = jsonBuffer.createObject(); fragwürdig aussieht. Referenz den Return-Wert einer Create-Methode? zumal die signatur laut https://arduinojson.org/v5/api/jsonbuffer/createobject/ so aussieht:
1 | JsonObject createObject(); |
Sprich, da kann man auch nicht argumentieren: mh schrieb: > Wenn du auch nur einen Blick in die Doku geworfen hättest, wüsstest du, > dass man an dieser Stelle eine Referenz verwenden MUSS. Wenn man einen blick in die offizielle Doku geworfen hat, sieht man, dass entweder die Doku oder der Beispielcode falsch sein muss. Das müsste mindestens Warnungen hageln.
:
Bearbeitet durch User
Vlad T. schrieb: > Wobei mir das: > > Weinga U. schrieb: >> JsonObject& root = jsonBuffer.createObject(); > > fragwürdig aussieht. > Referenz den Return-Wert einer Create-Methode? > > zumal die signatur laut > https://arduinojson.org/v5/api/jsonbuffer/createobject/ > so aussieht:JsonObject createObject(); > > Das sollte mindestens Warnungen hageln, oder nicht? Zum Glück ist dem Compiler die Dokumentation egal ;-) Im Quelltext ist der Rückgabewert eine Referenz.
mh schrieb: > Zum Glück ist dem Compiler die Dokumentation egal ;-) Im Quelltext ist > der Rückgabewert eine Referenz. Wie schön, dann sollte es aber JsonObject * root = jsonBuffer.createObject(); lauten ! Pointer (*)
gugl schrieb: > mh schrieb: >> Zum Glück ist dem Compiler die Dokumentation egal ;-) Im Quelltext ist >> der Rückgabewert eine Referenz. > > Wie schön, dann sollte es aber > > JsonObject * root = jsonBuffer.createObject(); > > lauten ! > > Pointer (*) Du weißt, dass es um c++ geht und was eine Referenz ist?
mh schrieb: > Du weißt, dass es um c++ geht und was eine Referenz ist? bin mir nicht sicher was du meinst, kannste das mal erklären?
Meiner bescheidenen Meinung nach wird eine Referenz genutzt um den (jetzt kommts) Pointer auf eine Variable oder sonstige Struktur zu bekommen. Man kann die Referenz dann zB. in einem Pointer speichern. da sind c und c++ gleich!
Ach da scheint ja was dran zu sein. C++ ist eben deswegen eine Krankheit weil es Zeichen als Operator verwendet, die eigentlich schon anderweitig belegt sind, also Doppelt und Dreifachnutzung von Symbolen. Schön ist das nicht:(
gugl schrieb: > C++ ist eben deswegen eine Krankheit weil es Zeichen als Operator > verwendet, die eigentlich schon anderweitig belegt sind C++ ist toll, weil man für Klassen die bekannten Operatoren definieren kann und es sich dann wie gewohnt verhält. Zum Beispiel eine Klasse, die mit fixed point Dezimal rechnet, sich aber durch +-*/ Operatoren wie eine normale Rechnung verwenden lässt.
gugl schrieb: > Ach da scheint ja was dran zu sein. C++ ist eben deswegen eine Krankheit > weil es Zeichen als Operator verwendet, die eigentlich schon anderweitig > belegt sind, also Doppelt und Dreifachnutzung von Symbolen. Das & ist an der Stelle kein Operator. Abgesehen davon belegt C den &-Operator auch bereits doppelt.
Beitrag #5651839 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.