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
Gast
#5647555
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).
Gast
#5647924
Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine echte Variable hin.
Gast
#5647936
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
Gast
#5648179
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 ;)
gugl schrieb: > Standard c ist das nicht! Ist ja auch C++.
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 | |
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.
Gast
#5648362
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.
Gast
#5651079
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 (*)
Gast
#5651087
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?
Gast
#5651100
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?
Gast
#5651107
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!
Gast
#5651120
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.