Variable als Referenz übergeben und in Klasse speichern

Hallo zusammen,

ich möchte gerne eine Variable als Referenz übergeben und diese in einer Klasse speichern, damit ich mit dieser (bei weiteren Funktionsaufrufen an die Klasse) weiter verarbeiten kann.

Die Referenz nehme ich mit SetString(String &json) entgegen und kann auch den ursprünglichen Text "in der Variable" verändern....also soweit alles gut. Nur....wie speichere ich die Referenz nun ab?

Das ist meine Klasse (nur eine .h Datei):

#ifndef JsonSimple_H
#define JsonSimple_H

#include "Arduino.h"

class JsonSimple {
  public:
    static bool   SetString(String &json)     { _json = json;
                                                json[2]='N';
                                                Serial.println("SetString(" + _json + ")");
                                                _json[4]='M';
                                                Serial.println("SetString(" + _json + ")");
                                                }    
	private:
    static String   _json;
};

String   JsonSimple::_json = "";

#endif

Ich rufe die Funktion wie folgt auf:

  String json = "{\"name\":\"Daniel\"}";
  Serial.println(json);
  JsonSimple::SetString(json);
  Serial.println(json);

Und die Konsole zeigt mir:

{"name":"Daniel"}
SetString({"name":"Daniel"})
SetString({"naMe":"Daniel"})
{"Name":"Daniel"}

Das Ändern mit "json[2]='N';" erfolgt also in dem referenzierten String, das Ändern mit "_json[4]='M';" (sollte die Referenz IN der Klasse sein) jedoch nicht. Hat jemand eine Idee???

PS.: Mir ist bekannt, dass ein String aus Gründen der Speicherverwaltung keine gute Wahl ist, es geht hier aber nur um ein optionales Tool, welches für den produktiven Betrieb nicht verwendet wird.

Referenzen kannst du nur im Konstruktor als gespeicherte Referenz in der Klasse übergeben, bei normalen Klassenfunktionen wird die Referenz ausgewertet.

Konnte das Problem doch noch selbst lösen. Falls jemand über den Thread stolpert:

    static bool   SetString(String &json)     { _json = &json;
                                                json[2]='N';
                                                Serial.println("SetString(" + *_json + ")");
                                                (*_json)[4]='M';
                                                Serial.println("SetString(" + *_json + ")");
                                                }

Die Speicheradresse in der Klasse:

    static String   *_json;

Und die Zuweisung unter der Klasse:

String  *JsonSimple::_json = NULL;

Wenn ich die Klasse bzw. die Funktion dann wie oben beschrieben aufrufe, erhalte ich auf der Konsole die Ausgabe:

{"name":"Daniel"}
SetString({"Name":"Daniel"})
SetString({"NaMe":"Daniel"})
{"NaMe":"Daniel"}

...............es sind also alle Zeichen im originalen String ersetzt worden und somit greife ich immer auf die Referenz zu.

...gerade erst deinen Post gelesen. Genau kann ich den Unterschied zwischen Referenz und Pointer nicht erklären bzw verstehen, aber wie gezeigt funktioniert es.

Ein Pointer ist eine veränderliche Variable, eine Referenz ist sozusagen konstant, sobald sie erstmalig zugewiesen wurde.

Das ist nicht unbedingt die richtige Lösung! Das Stichwort was du suchst nennt sich "Konstruktor" und "Initialisierungsliste":

So kann man es schon beim Erstellen des Objekts initialisieren:

JsonSimple(String &json)  : _json(json)
{
}

Die Zuweisung muss außerhalb des Konstruktor-Körpers erfolgen. Wenn darin ist wurden die Variablen schon Default-Initialisiert.
Damit kann man dann auch Konstanten und Referenzen initialisieren

Das geht natürlich nur einmal. Was aber oft reicht. Nur wenn man den Inhalt später noch ändern muss braucht man Zeiger.

Und diese Unterscheidung der Variablen mit dem Unterstrich ist überflüssig. Die können auch gleich heißen.
Und auch ohne die Initialisierungsliste kann man das mit dem this-Zeiger lösen

this->var = var;

Ich möchte es mal so formulieren:
Ein Pointer ist ein Zeiger auf einen Speicherbereich.
Eine Referenz ist ein Alias. Also ein zweiter Name für ein schon vorhandenes Ding.

Zudem halte ich statische Eigenschaften in Klassen für sehr bedenklich. Denn sie widersprechen dem "Anstand".
Wenn dann, ist eher das "Singleton Pattern" die bessere Wahl.
Aber auch da lauern Fallen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.