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


  • Mod

    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-Instanz
    
    SerialEncode(SerialDecode *a); // erwartet aber einen Pointer auf ein SerialDecode
    

    Richtig wäre:

    SerialEncode ne(&se); // oder besser noch, per Referenz statt per Pointer
    

    Vielleicht mal ein C++-Einsteiger-Tutorial lesen. C und C++ unterscheiden sich gewaltig.


  • Mod

    Ach, wenn wir schon bei Codeverbesserungen sind, habe ich noch ein paar mehr:

    • stdlib.h ist veraltet, das heißt cstdlib .
    • Rückgabetyp von main muss immer int sein.
    • Zeile 14 in main.cpp macht gar nichts.
    • system("PAUSE") ist nicht portabel, siehe FAQ um das gleiche zu erreichen.
    • #pragma once ist 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.
    • void muss man in der Argumentenliste nicht angeben. In C++ heißt eine leere Liste das gleiche wie void in 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.


Anmelden zum Antworten