Methodendefinitionen - aber wo?



  • Guten Abend,

    ich bin momentan am C++ lernen und im Moment bei den Grundlagen von Klassen.
    Ich benutze ein Buch zum Lernen (keine Sorge, nicht Jürgen Wolf)
    und dort wird gesagt,
    dass die Methoden nicht in der Klasse (in der Header-Datei) selbst, sondern in einer Quelldatei definiert werden sollen.
    In der Klasse selbst erfolgt nur die Deklaration.
    Was ist nun besser / sinnvoller?
    So:

    // tag.h
    
    class Tag  
    { 
    private: 
    int tag; 
    public: 
    void init(int _tag); 
    };
    
    // tag.cpp
    #include "tag.h"
    
    void Tag::init(int _tag)
    { 
    tag = _tag; 
    }
    

    oder direkt

    // tag.h
    
    class Tag  
    { 
    private: 
    int tag; 
    public: 
    void init(int _tag)
    { 
    tag = _tag; 
    }};
    


  • Wenn es echt nur eine bis zwei Zeilen sind, kannst du die Methode auch direkt in der Klassendeklaration definieren.

    Ansonsten benutze eine Quelldatei.

    Bei wirklich kleinen Klassen (sagen wir 50 - 100 Zeilen[mitsamt den Definitionen]) würde ich sogar komplett auf die Quelldatei verzichten.



  • nudeln schrieb:

    Wenn es echt nur eine bis zwei Zeilen sind, kannst du die Methode auch direkt in der Klassendeklaration definieren.

    Ansonsten benutze eine Quelldatei.

    Bei wirklich kleinen Klassen (sagen wir 50 - 100 Zeilen[mitsamt den Definitionen]) würde ich sogar komplett auf die Quelldatei verzichten.

    Ich schätze mal, einfach wegen der Übersicht halber, oder hat das einen speziellen Grund?
    Und wenn ich die Methoden dann in anderen Quelldateien benutzen möchte, muss ich dann trotzdem nur die Header-Datei mit der Klasse oder auch noch die Quelldatei mit den Definitionen importieren?



  • Folgender Code:

    class Class{
    public:
        void foo() { ... }
    };
    

    ...ist haargenau das selbe, als würdest du folgendes schreiben:

    class Class{
    public:
        inline void foo() { ... }
    };
    

    Wobei jedoch nicht geinlined werden muss, das entscheidet dein Compiler.
    Und ja, verwende bei großen Dingern .cpp-Dateien; Übersichtlichkeit for the win.



  • Und wenn ich die Methoden dann in anderen Quelldateien benutzen möchte, muss ich dann trotzdem nur die Header-Datei mit der Klasse oder auch noch die Quelldatei mit den Definitionen importieren?

    Du musst dann nur die Headerdatei inkludieren.

    Wie kommst du eigentlich auf "import"? Sollte es nicht #include sein?



  • Schöner empfinde ich in jedem Fall die zweite Methode. Wenn die Funktionen so groß werden dass man da total den Überblick verliert, ist das eher ein Zeichen dafür, dass man da ein bisschen Funktionalität trennen sollte.

    So einfach ist das aber (noch? ;)) nicht mit C++. Das Definieren von Membern in Header-Dateien bringt einige Probleme mit sich, da die ganze Kompilations-Ma­schi­ne­rie von C übernommen wurde. Generell werden alle .c/.cpp Dateien einzeln zu so genannten Objektdateien kompiliert. (Und hinterher zu einem Programm gelinkt.) #include wird vor der eigentlichen Kompilierung vom Preprozessor aufgelöst, und der macht nichts anderes als den gesamten Dateiinhalt zu kopieren. Wenn du also etwas in einer .c/.cpp-Datei änderst, muss nur diese neu kompiliert werden. Wenn du etwas in einem Header änderst, müssen alle Dateien die diese Datei einbinden neu kompiliert werden, logisch. Heißt: Größere Header bedeuten irgendwann auch längere Wartezeiten. Das ist das erste Problem. Das zweite sind Gegenseitige Abhängigkeiten. Angenommen du hast eine Klasse A die in ihren Methoden die Methoden der Klasse B benutzen will - und umgekehrt. Das funktioniert aber nicht wenn du Deklaration und Definition der Methoden nicht trennst, weil der Typ ja definiert sein muss, bevor du seine Methoden kennst.

    Wie so oft gibt es also keine einfache Regel die man hier befolgen kann, ich würde dir einfach raten Version 2 zu nehmen, und wenn du in eine der oben beschriebenen Probleme rennst (kompilieren dauert zu lange / gegenseitige Abhängigkeiten), kannst du ja immer noch die "schuldigen" Klassen umschreiben.



  • Alles klar, vielen Dank an die vielen Antworten.
    Ich hatte mich nur gefragt, ob, wenn ich die Methoden in anderen Quelldateien benutzen möchte, ich dann trotzdem nur die Header-Datei mit der Klasse oder auch noch die Quelldatei mit den Definitionen inkludieren muss. Aber das muss ich ja anscheinend nicht.
    Und @nudeln: Ich meinte natürlich #include 😉 kleiner Fehler, war bei Java



  • Anonymus42: Quellcodedateien werden nie inkludiert. 😉

    wenn du eine Klasse namens Class in Datei A.hpp schreibst, seine Methoden in eine Datei namens A.cpp definierst, und nun deine Klasse in der B.cpp verwenden möchtest reicht es wie gesagt nur die Headerdatei zu inkludieren.

    Have a nice day.

    <ot>
    Ich komm einfach grad net vom Rechner weg 😛 *gnihihihihihi*
    *mit Küsschen um sich werf*
    </ot>



  • nudeln schrieb:

    Anonymus42: Quellcodedateien werden nie inkludiert. 😉

    wenn du eine Klasse namens Class in Datei A.hpp schreibst, seine Methoden in eine Datei namens A.cpp definierst, und nun deine Klasse in der B.cpp verwenden möchtest reicht es wie gesagt nur die Headerdatei zu inkludieren.

    Have a nice day.

    <ot>
    Ich komm einfach grad net vom Rechner weg 😛 *gnihihihihihi*
    *mit Küsschen um sich werf*
    </ot>

    Perfekte Erklärung, danke 🙂


Log in to reply