Problem mit Klasse



  • Hallo wenn ich mein Programm Kompilieren möchte bekomme ich folgende Fehlermeldung:

    [C++ Fataler Fehler] calc.h(1): F1005 Include-Dateien zu tief verschachtelt

    Aber leider kann ich mit der Fehlermeldung nichts anfangen. 😞

    Was mache ich falsch ?

    main.cpp

    #include <iostream>
    #include "calc.h"
    using namespace std;
    
    int main()
    {
    
    system("PAUSE");
    return 0;
    }
    

    calc.h

    #include <iostream>
    #include "calc_prog.h"
    
    using namespace std;
    
    #ifndef calc_prog.h
    #define calc_prog.h
    
    class calc
    {
    	private:
    
    	public:
                    int add();
    };
    #endif
    

    calc_prog.h

    #include <iostream>
    #include "calc.h"
    
    using namespace std;
    
    #ifndef calc_prog.h
    #define calc_prog.h
    
            int calc :: add ()
            {
              cout<<"test"<<endl;
            }
    
    #endif
    


  • In der main inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    In der calc_prog.h inkludierst du calc.h
    In der calc.h inkludierst du calc_prog.h
    Und so weiter...

    Ein #include ist reine Text-Substitution. Der Inhalt der zu inkludierenden Datei wird quasi reinkopiert.

    Wenn sich zwei Dateien gegenseitig inkludieren hast du sowieso schon ein sehr schlechtes Design, das du überdenken solltest.



  • Außerdem verwendet man nie using namespaces in Headern. Damit importierst du den ganzen Namespaces in jedes Modul, dass die problematische Headerdatei direkt oder indirekt einbindet.



  • Wie macht man es den richtig ?



  • stell doch fürs erste mal die zeilen 6 und 7 an den anfang der calc.h bzw. calc_prog.h dateien.
    calc_prog.h kommt evtl. in eine calc.cc datei?

    lg lolo



  • In die Header-Datei kommt die Klassendefinition:

    class Foo {
      void method();
    };
    

    In die Source-Datei kommen die Definitionen der Funktionen:

    #include "fooHeaderDatei"
    
    void Foo::method() {  }
    

    In jeder anderen Datei, in der du die Klasse benutzen möchtest, bindest du die Header-Datei ein.



  • Also dann müsste das ja bei mir eigentlich so aussehen oder ?

    Wie kann ich das dann jetzt Kompilieren o_O ?

    main.cpp

    #include <iostream>
    #include "calc.h"
    using namespace std;
    
    int main()
    {
    calc a;
    
    a.add();
    
    system("PAUSE");
    }
    

    calc.h

    #include <iostream>
    using namespace std;
    
    class calc
    {
    	private:
    
    	public:
                    int add();
    };
    

    calc_prog.cpp

    #include <iostream>
    #include "calc_prog.h"
    
    #ifndef calc_prog.h
    #define calc_prog.h
    
    using namespace std;
    
            int calc :: add ()
            {
                    cout<<"test"<<endl;
            }
    
    #endif
    


  • Muss man da so ein Makefile erstellen ?



  • Makefiles machen das kompilieren nur einfacher. Sie sind nie notwendig.



  • Habs jetzt hinbekommen danke für die Hilfe.


Anmelden zum Antworten