Vorwärtsreferenzen, oder wie man rekusive Klassenabhänigkeiten auflösen kann



  • Hallo,

    ich bin gerade dabei mir ein bisschen C++ anzueignen. Ich bin jedoch kein neuling was das Programmieren angeht!

    Zum Lernen schreibe ich momentan an einem kleinen Programm. In welchem ich versuche möglichst sauber und OO zu programmieren.

    Ich bin jedoch auf ein Problem gestoßen, welches sich durch die strukturierung des OO-Codes ergibt.

    Das Programm simuliert logische Schaltungen. Und man kann Bauteile und Verbindungen einfügen. Ich möchte auch mehrere Bauteile zu einem integrierten Bauteil zusammenfassen. Und da stoße ich auf das Problem.

    Hier eine stark vereinfachte Klassendefinition, um das Problem zu verdeutlichen:

    class class_gate
    {
    	private:
    		int type;
    		union
    		{
    			int IO_Pins; //Für kleine Bautiele wie AND, OR, XOR
    			class_workspace *ic; //Pointer zur Datenstruktur eines Integrierten Schaltkreises (DAS IST MEIN PROBLEM)
    		}
    	public:
    		void set_pos_x(int new_x);
    		void logic();
    }
    
    class class_workspace
    {
    	private:
    		class_gate *gate;
    	public:
    		void creat_new_gate(int x, int y, int type);
    }
    

    Ich habe also ersteinmal die Arbeitsfläche (class_workspace) in der ich Bauteile (class_gate) erstellen kann.
    Nun will ich aber in einem Bauteil eine weitere Arbeitsfläche zusammenfassen.

    Ich sehe momentan nur 2 Lösungswege:

    1. Ich lagere die Methoden der class_gate aus, und setzt sie unter class_workspace. Das ist jedoch ein Bruch im OO-Code.

    2. Eventuell gibt es die möglichkeit einer Vorwärtsreferenzen. So das class_workspace schon im class_gate bekannt ist.

    Ich würde Nr. 2 bevorzugen. Gibt es eventuell noch andere Lösungen?



  • Hallo

    2. Eventuell gibt es die möglichkeit einer Vorwärtsreferenzen. So das class_workspace schon im class_gate bekannt ist.

    So ähnlich. Das heißt Forward Declaration und sieht ganz einfach aus

    class class_workspace; // Forward Declaration
    
    class class_gate
    {
    ...
    };
    
    class class_workspace
    {
    ...
    };
    

    Die Semikolone nach den Klassendefinition darfst du aber so oder so nicht weglassen.

    bis bald
    akari


Anmelden zum Antworten