Frage zu include in Klassen



  • Hallo was ist besser,schneller oder sinnvoller Beispiel 1 oder Beispiel 2 ?
    Meiner Meinung nach würde ich ehr Beispiel 2 bevorzugen weil man sich da ja eine Datei sparen kann.

    Was meint Ihr ?

    Beispiel 1:

    main.cpp

    #include <iostream>
    #include "f.h"
    
    int main()
    {
    
    calc c;
    c.add(); 
    
    system("PAUSE");
    }
    

    f.h

    #include <iostream>
    using namespace std;
    
    #ifndef f.h
    #define f.h
    
    class calc
    {
    
    	public:
    	void add ();
    
    };
    
    #endif
    

    a.cpp

    #include <iostream>
    #include "f.h"
    using namespace std;
    
    void calc :: add ()
    {
    cout<<"ok"<<endl;
    }
    

    Beispiel 2:

    main.cpp

    #include <iostream>
    #include "f.h"
    
    int main()
    {
    
    calc c;
    c.add(); 
    
    system("PAUSE");
    }
    

    f.h

    #include <iostream>
    using namespace std;
    
    #ifndef f.h
    #define f.h
    
    class calc
    {
    
    	public:
    	void add ();
    
    };
    
    void calc :: add ()
    {
    cout<<"ok"<<endl;
    }
    
    #endif
    


  • Das erste.

    Davon abgesehen das:
    a) include guards vor allem anderen kommen
    b) NIEMALS using namespace in einen Header gehört
    c) deine Defines der guards blöd sind lieber IC_F_H oder sowas verwenden als f.h



  • class schrieb:

    Hallo was ist besser,schneller oder sinnvoller Beispiel 1 oder Beispiel 2 ?
    Meiner Meinung nach würde ich ehr Beispiel 2 bevorzugen weil man sich da ja eine Datei sparen kann.

    Eindeutig Variante 1b (1 mit einigen Modifikationen). Mit der Methode 2 erhöhst du die Linkabhängigkeiten, wirst früher oder später an zyklischen Referenzen scheitern... In C++ wird die Trennung nicht ohne Grund durchgeführt.

    Variante 1b:

    // main.cpp
    // #include <iostream> Wird hier nicht benutzt
    #include "f.h"
    
    int main()
    {
      calc c; // Scopeweise einrücken, für bessere Übersicht
      c.add(); 
    
      system("PAUSE");
    }
    
    // f.h
    // Includeguards um den gesamten Code legen
    #ifndef f_Header
    #define f_Header
    
    // #include <iostream> Wird hier nicht benutzt
    // using namespace NIEMALS im Header
    
    class calc
    {
      public:
        void add();
    };
    
    #endif
    
    // a.cpp
    #include <iostream>
    #include "f.h"
    
    using namespace std; // Wichtig: Nach allen Includes
    
    void calc::add()
    {
      cout << "ok" << endl;
    }
    

    Man sollte "using namespace" so lokal wie möglich einsetzen (includes übrigens auch). Ich finde auch merkwürdig das du bei den Methodenbezeichnern mit Leerzeichen um dich wirfst, bei einem cout im Gegenzug alles quetschst.



  • Das zweite wird nicht funktionieren, solltest du den Header an zwei Stellen einbinden sollen.



  • Wo ist den der Unteschied hier ?

    #ifndef f_Header
    #ifndef f.h



  • class schrieb:

    Wo ist den der Unteschied hier ?

    #ifndef f_Header
    #ifndef f.h

    Du darfst keinen . in Makro-Bezeichner haben. Ansonsten gibt es keinen Unterschied. Das erste prüft eben auf den Bezeichner "f_Header", das zweite auf den (ungültigen) Bezeichner "f.h".

    Google mal nach Pre-Prozessor.


Anmelden zum Antworten