Vorwärtsdeklaration oder so ähnlich



  • Hi,
    ich habe in einem Code eine main.cpp und zwei Header. In einem ist die Klasse Class1 und im anderen die Klasse Class2 deklariert. Dazu habe ich noch die dazugehörigen cpp dateien, in denen ich die Konstruktoren der Klassen definiert habe.

    //main.cpp
    #include "class1.h"
    #include "class2.h"
    
    int main()
    {
    }
    
    //class1.h
    class class1
    {
    public:
        class1(int a,int b);
    };
    
    //class2.h
    class class2
    {
    public:
        class2(int a,class1 b);
    }
    
    //class1.cpp
    #include "class1.h"
    class1::class1(int a,int b)
    {
    }
    
    //class2.cpp
    #include "class2.h"
    class2::class2(int a,class1 b)  //an dieser Stelle bekomme ich den Fehler
    {
    }
    

    wenn ich das ganze kompilieren will, bekomme ich natürlich einen Fehler. Class1 ist in der class2.cpp nicht bekannt. Aber auch inkludieren der Class1.h hilft nicht weiter. Wie kann ich das lösen ?



  • So ich hab die Sachen alle mal umgeschrieben. Jetzt sieht das ganze so aus:

    main.cpp:

    #include "Klasse1.h"
    #include "Klasse2.h"
    
    int main(void)
    {
        return (0);
    }
    

    Klasse1.h:

    #ifndef KLASSE1_H
    #define KLASSE1_H
    //Klasse1.h
    class Klasse1
    {
    public:
        Klasse1(int a,int b);
    };
    #endif
    

    Klasse2.h:

    #ifndef KLASSE2_H
    #define KLASSE2_H
    //Klasse2.h
    class Klasse1; //Hier ist eine Vorwärtsdeklaration, damit in der Definition von Klasse2 Klasse1 bekannt ist
    class Klasse2
    {
    public:
        Klasse2(int a,Klasse1 b);
    };
    #endif
    

    Klasse1.cpp:

    //Klasse1.cpp
    #include "Klasse1.h"
    Klasse1::Klasse1(int a,int b)
    {
    }
    

    Klasse2.cpp:

    //Klasse2.cpp
    #include "Klasse1.h"
    #include "Klasse2.h"
    Klasse2::Klasse2(int a,Klasse1 b)
    {
    }
    

    Das funktioniert. Ich würde übrigens die Klassen nie class1 nennen, das hat zu große Ähnlichkeit mit dem Keyword class.

    Felix



  • Danke für die Mühe 😃

    Das "Klasse1" usw war nur zur Demonstration, in wirklichkeit heißen sie anders, und die defines habe ich wegen der Übersicht weggelassen.

    Frohes neues Jahr :xmas2:


Anmelden zum Antworten