Problem mit Klassen in mehreren Header-Dateien



  • Hi, nachfolgend erstmal der Quelltext und dann zu meinem problem

    "klassen.cpp"

    #include <iostream>
    #include "class1.h"
    #include "class2.h"
    
    void main()
    {
    	klasse1 test1;
    	klasse2 test2;
    	test1.setz1(5);
    	test2.setz2(6);
    	test2.setz1(7);
    	std::cout<<test1.getz1()<<"\n"<<test2.getz1()<<"\n"<<test2.getz2()<<"\n";
    }
    

    "class1.h"

    #ifndef __klasse1_H__
    #define __klasse1_H__
    
    class klasse1{
    protected:
    	int z1;
    public:
    	void setz1(int i)
    	{
    		z1=i;
    	}
    	int getz1()
    	{
    		return z1;
    	}
    };
    #endif
    

    "class2.h"

    #ifndef __klasse2_H__
    #define __klasse2_H__
    
    #include "class1.h"
    
    class klasse2:public klasse1{
    private:
    	int z2;
    public:
    	void setz2(int i)
    	{
    		z2=i;
    	}
    	int getz2()
    	{
    		return z2;
    	}	
    };
    #endif
    

    so jetzt zu meinem problem, das programm funktioniert so wie es oben dargestellt ist einwandfrei. ist auch nur ein Test-Programm , also hat auch keine weitere Funktion.

    Das Problem ist, wenn ich mehrere Klassen und Unterklassen in verschieden Header-Dateien packe, lässt sich das programm nicht mehr kompilieren. Da hab ich nochmal nachgeschaut wie andere Leute das so machen und bin da auf folgendes gestoßen:

    #ifndef __klasse1_H__
    #define __klasse1_H__
    //Klassendeklarationen
    #endif
    

    diesen code schreiben die die da immer hin, nun habe ich dieses auch gemacht und es funktioniert. schön und gut aber möchte auch wissen warum?? hat da jemand nee eindeutige erklärung für mich ?
    danke schon mal



  • Diese drei Präprozessordirektiven (mit dem # vorne) verhindern, dass ein und die selbe Header-Datei mehrfach #include'ded wird und der Compiler deshalb meckert.

    Stell dir mal das hier vor:
    foobar.cpp:

    #include "foobar.h"
    #include "foobar.h"
    

    foobar.h

    class A
    {
    };
    

    Jetzt würde der Compiler meckern, weil er die Klasse A schon existiert, nämlich weil der selbe Header schon einmal eingebunden wurde:
    foobar.h

    #ifndef FOOBAR_H // <-- NUR weiter machen, wenn FOOBAR_H noch NICHT definiert ist
    #define FOOBAR_H // <-- definiert FOOBAR_H, "verhindert" erneutes einbinden
    
    class A
    {
    };
    
    #endif
    


  • super, danke. das hab ich verstanden . ist natürlich logisch. deswegen hatte mein compiler auch fehler gemacht. danke dir



  • nennt sich auch include guard (-> google kann dir da mehr erklären...)


Anmelden zum Antworten