Frage zur Komposition in C++



  • Hi Leute!

    Ich wollte heute mal mit so einem beispielhaften C++Programm versuchen, eine Komposition nach zu bauen. Leider gelingt es mir nicht so richtig, auch wenn der Compiler mir es kompiliert. Ich hab hier mal die Klassen reinkopiert:

    #ifndef CLASSA_H
    #define CLASSA_H
    
    class classA
    {
    private:
    	int A;
    
    public:
    	classA();
    	~classA();
    
    	void textA();
    };
    
    #endif CLASSA_H
    
    #ifndef CLASSB_H
    #define CLASSB_H
    
    class classB
    {
    private:
    	classA A;
    
    public:
    	classB();
    	~classB();
    
    	void textB();
    };
    
    #endif CLASSB_H
    
    #ifndef CLASSC_H
    #define CLASSC_H
    
    class classC
    {
    private:
    	classB B;
    
    public:
    	classC();
    	~classC();
    
    	void textC();
    };
    
    #endif CLASSC_H
    

    Hier noch symbolisch die Implementierung einer Klasse; die anderen übrigen Klassen folgen dem gleichen Schema:

    #include"classA.h"
    #include<iostream>
    
    classA::classA()
    {
    
    }
    
    classA::~classA()
    {
    
    }
    
    void classA::textA()
    {
    	std::cout << "Wir sind in classA!" << std::endl;
    }
    

    Wie man sehen kann, hab ich alle Klassen in getrennten Dateien implementiert. Ich hab nun das Programm aus einer main herausgestartet und dabei erwartet, dass mit der Deklaration von "classA myClass" und "myClass.text..." auf alle Methoden zugreifen kann, was aber nicht funktioniert. Laut UML hat ein Gebäude ein oder mehrere Zimmer. Wobei das Gebäude nach zerstörung des Zimmers nicht existieren kann, wodurch zwingend folgt, dass für ein Gebäude ein Zimmer verfügbar sein muss...

    Könnt ihr mir da ein bisschen weiterhelfen?



  • vip@r schrieb:

    ...was aber nicht funktioniert...

    Fällt dir was auf? Kleiner Tipp: es fehlt eie Information...



  • Oh, entschuldigt bitte, das passiert immer wieder. Hier noch die Compiler-Meldung:

    Fehler	1	error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'A'
    


  • Und wie sieht die Zeile aus, in der der Fehler auftritt (am besten den ganzen Code posten, reduziert auf das Wesentliche).



  • Der sehr reduzierte Code sieht so aus:

    class classB
    {
    private:
    	classA A;
    
    public:
    	classB();
    	~classB();
    
    	void textB();
    };
    

    Der Fehler ist hier dann in Zeile 4. Hier stände laut compiler kein ;



  • Das Problem ist, dass in Klasse classB die Klasse classA nicht bekannt ist. Versuch es mal mit einer Vorwärtsdeklaration:

    class classA;
    
    class classB
    {
    private:
        classA A;
    
    public:
        classB();
        ~classB();
    
        void textB();
    };
    

    (ungetestet)



  • Leider führt das so nicht zum gewünschten Erfolg. Compiler-Error: Fehler 1 error C2079: 'classB::A' verwendet undefiniertes class 'classA'

    Ich hab mir zum ausgegebenen Fehler, mal die FAQ von VisualStudio durchgelesen, und die empfehlen das hier:

    class classB
    {
    private:
    	classA* A;
    
    public:
    	classB();
    	~classB();
    
    	void textB();
    };
    

    Man beachte wieder Zeile 4. Hier solle man einen pointer deklarieren. Wenn ich nun in der Implementierungsdatei zur Klasse classB die Funktion textA() aufrufen will, muss ich dementsprechend mit "->"-Operator arbeiten.

    Irgendwie kapiere ich das nicht. Wenn ich nämlich die 3 unterschiedlichen Klassen in eine einzige Klassendatei (Deklaration der Klasse sowie Implementierung der Methoden!) schreibe, dann funktioniert das Ganze ohne der Pointer...



  • Entschuldige. Wenn du Objekte vom Typ classA in classB verwenden willst, musst du in der classB.h den Header classA.h inkludieren, da hier eine Vorwärtsdeklaration nicht ausreicht. Anders wäre das bei Pointern oder Referenzen auf classA:

    class classA;
    
    class classB
    {
        private:
            classA* A1; // geht
            classA& A2; // geht
            classA A3; // geht nicht
    
        public:
            classB();
            ~classB();
    
            void textB();
    };
    

    Mit #include:

    #include "A.h"
    
    class classB
    {
        private:
            classA A3; // geht, da A.h inkludiert wird
    
        public:
            classB();
            ~classB();
    
            void textB();
    };
    

Anmelden zum Antworten