Objektverweis an Klasse übergeben
-
Moin,
ich schreibe gerade mehrere Klassen für mein Autopilotprojekt. Dafür gehören auch eine Klasse zum Kodieren der Daten zum senden, und eine zum Dekodieren der Daten. Nachdem die Daten Dekodiert werden, werden sie in Public Variablen, in der Klasse gespeichert. Das Problem ist jetzt aber, dass die Klasse zum Kodieren der Daten, auch auf die Dekodierten Variablen zugreifen können muss. In der Klasse zum Kodieren der Daten, greife ich auch über ein Objektverweis auf die Variablen in der Klasse zu, aber wenn ich über den einen Verweis die Daten, ändere, bleiben die Daten im 2. Objektvergleich gleich. Ich habe versucht, den Objektverweis aus dem Hauptprogramm an die Klasse zu übergeben, aber ich habe es nicht geschafft. Wie kann ich einen Objektverweis an eine Klasse übergeben?
MfG
Philipp
-
Zu viele Kommas, zu wenig Code. Zeig ein minimales Code-Beispiel, das dein Problem illustriert.
-
Ok sorry...
main.cpp:#include <iostream> #include <stdlib.h> #include "waypoint.h" #include "SerialDecode.h" #include "SerialEncode.h" //#include "SerialDecode.h" using namespace std; void main(){ SerialDecode se; SerialEncode ne = SerialEncode(se); se.servo = 95; ne.show(); cout << ne.show() << endl; system("PAUSE"); }Ausschnitt aus Klasse Decode:
#pragma once class SerialDecode { public: /*Variablen*/ //New Waypoint int new_ID, next_ID; float lat,lon, distance; //Steuerung int servo,motor,bow; //Navigation int course; /*Funktionen*/ void Decode(char input[500]); SerialDecode(void); ~SerialDecode(void); private: //Steer Commands void Decode_servo(char input[500]); void Decode_motor(char input[500]); void Decode_bow(char input[500]); //Navigation Commands void Decode_new_waypoint(char input[500]); void Decode_direct(char input[500]); void Decode_course(char input[500]); void Decode_distance(char input[500]); };Auschnitt aus Klasse Encode:
SerialEncode.h: #include "SerialDecode.h" #pragma once class SerialEncode { public: SerialEncode(SerialDecode *a); ~SerialEncode(void); int show(); private: SerialDecode decode; }; SerialEncode.cpp: #include "SerialEncode.h" #include "SerialDecode.h" SerialEncode::SerialEncode(SerialDecode *a) { this->decode = *a; } SerialEncode::~SerialEncode(void) { } int SerialEncode::show(){ return this->decode.servo; }Ich möchte jetzt, das ich auf Klasse SerialDecode aus der Klasse SerialEncode zzugreifen kann, aber mit dem gleichen Objektverweis, wie in der main.cpp, damit die Daten gleich bleiben.
Philipp
-
Du machst ja auch eine Kopie und keinen Verweis. decode in SerialEncode muss eine referenz oder ein Pointer sein.
edit: Obiges ist eine rein technische Antwort. Ich habe mir jetzt nicht angeguckt, ob dieser Verweis überhaupt sinnvoll ist. Solche Konstruktionen finde ich immer etwas merkwürdig.
-
Ich arbeite noch nicht solange mit OOP, und weiß deswegen noch nicht viel.
Wie kann ich das machen?Philipp
-
Ah, ein C-Programmierer.

In C++ verwendet man eher std::string statt char[]. (void) für eine leere Argumentliste ist unüblich. public-Member auch, aber darüber könnte man streiten. const-correctness wird als wichtig angesehen, dein Code hat sie nicht; ist nicht überlebenswichtig, aber unschön. IMHO sind Referenzen Pointern vorzuziehen.SerialEncode ne = SerialEncode(se); // übergibt ein SerialDecode per Wert an eine SerialEncode-InstanzSerialEncode(SerialDecode *a); // erwartet aber einen Pointer auf ein SerialDecodeRichtig wäre:
SerialEncode ne(&se); // oder besser noch, per Referenz statt per PointerVielleicht mal ein C++-Einsteiger-Tutorial lesen. C und C++ unterscheiden sich gewaltig.
-
Ach, wenn wir schon bei Codeverbesserungen sind, habe ich noch ein paar mehr:
stdlib.hist veraltet, das heißtcstdlib.- Rückgabetyp von
mainmuss immerintsein. - Zeile 14 in main.cpp macht gar nichts.
system("PAUSE")ist nicht portabel, siehe FAQ um das gleiche zu erreichen.#pragma onceist auch nicht portabel und selbst auf Compilern die es kennen "deprecated". Nutze klassische Include-Guards.- Aufbau der Klassen: Die Variablen alle public und die Funktionen alle private? Wo hast du dieses Design denn her?
- Kommentare im C-Stil (/* ... */) sind in C++ eher selten genutzt, weil meistens unpraktisch. Insbesondere wenn der Kommentar ohnehin nur eine Zeile lang ist.
voidmuss man in der Argumentenliste nicht angeben. In C++ heißt eine leere Liste das gleiche wievoidin C.- Benutzung von char[]: siehe Nukularfüsiker.
- this-Qualifizierung für Membervariablen ist unnötig.
- Destruktoren und Konstruktoren: Warum schreibst du welche, wenn sie nicht machen?
Und an der Sinnhaftigkeit der Verweistechnik zweifle ich hier ebenfalls, aber über Objektdesign können wir uns ein anderes Mal unterhalten. Wenn du obige und Nukularfüsikers Hinweise berücksichtigst, wird das deinen Codestil schon einmal viel besser sein und die Leute auch hören nicht gleich auf zu Lesen, wenn sie deinen Code sehen.