Erstellen von Klassen



  • Hallo Forum,

    ich bin zwar der Meinung das prinzipielle Konzept von Klassen verstanden zu haben aber dennoch stoße ich des öfteren auf Source Codes die viele Dinge anders handhaben.

    Normaler Weise wenn ich eine Klasse baue setze ich das ganze ja wie folgt zusammen:

    Die Header Datei

    class test
    {
    public:
      test();
      ~test();
      int irgendwas(int vari);
    };
    

    und die cpp File

    #include "test.h"
    
    test::test()
    {
      // irgendwas
    }
    
    test::~test()
    {
      // irgendwas
    }
    
    int test::irgendwas(int vari)
    {
      // eigentliche Programmlogik.
    }
    

    Jetzt habe ich aber schon des öfteren gesehen das es scheinbar auch möglich ist in der Headerdatei schon festzulegen was die Funktionen erledigen also schon den eigentlich Code in die Funktionen in die Header Datei packen und keine cpp File für die Klasse anzulegen.

    Warum ist sowas möglich oder hab ich da einfach was falsch verstanden? Damit ihr vieleicht besser versteht was ich meine:

    class test
    {
    public:
      int meinevar;
      test();
      ~test();
    
     int irgendwas(int vari)
     {
       meinevar=555;
       // und weitere 
     }
    };
    

    Wäre super wenn mich da jemand aufklären könnte.





  • Jenso schrieb:

    ...Warum ist sowas möglich oder hab ich da einfach was falsch verstanden?...

    Wäre super wenn mich da jemand aufklären könnte.

    Du hast nichts falsch verstanden, nur gibt es halt zwei Varianten (in der Regel ist die von dir gewählte die "saubere"). Prinzipiell könnte man alles in Headerdateien schreiben, und auf die cpp verzichten.

    Grundsätzlich gibt es für beide Varianten Gründe (letztere Form sollte man aber eher selten anwenden). Dazu ein paar kurze Informationen (genaueres liefert dir Fachliteratur, z.B. die "effektiv"-Reihe von Scott Meyers):

    a) Um den Linkaufwand zu reduzieren ist es immer sinnvoller includes in der Sourcedatei unterzubringen und mit Vorwärtsdeklarationen zu arbeiten.
    b) Grundsätzlich sollte man immer gegen die Schnittstelle (Header) programmieren, niemals gegen die Implementationsdetails (Source). Eine Trennung unterstützt diese Herangehensweise.
    c) Für Bibliotheken muss in der Regel die Schnittstelle bekannt gemacht werden. Nur möchtest du den internen Aufbau der Bibliothek allen Anwendern zeigen? (sprich: dir deinen eigenen Lebensunterhalt entziehen? ;p)
    d) Nötig sind Headerimplementierungen vorwiegend bei Templates (das Thema solltest du wenn ich deinen Wissensstand richtig einschätze aber eher nur am Rande kennen gelernt haben, daher verzichte ich dies hier näher zu erläutern).

    cu André



  • Klasse! Vielen Dank für die ausführliche Antwort, alles beantwortet.

    Dann kann ich auch endlich wieder ruhig schlafen! 😃

    Gruß Jenso


Anmelden zum Antworten