Interfaces und abstrakte Klassen in C++



  • Sorry, eure Texte konnte ich erst jetzt lesen.
    Ist dann IVogel eine Header- oder eine cpp-Datei? Rine cpp-Datei braucht doch eine Header-Datei oder?



  • Nein.
    Header-Dateien werden sozusagen cut&paste per #include in die Dateien eingefügt. Das ist alles... Sie werden in keinster weise speziell behandelt.



  • Fenixx schrieb:

    Sorry, eure Texte konnte ich erst jetzt lesen.
    Ist dann IVogel eine Header- oder eine cpp-Datei? Eine cpp-Datei braucht doch eine Header-Datei oder?

    *.hpp ist ein Header. Aber eine .cpp braucht nicht zwangsläufig einen Header. Allgemein definiert man halt die Funktionen aus einer .cpp in einer .hpp oder .h und man definiert Klassen in einer .hpp oder .h und implementiert sie in einer .cpp. Man kann eine Klasse aber auch "inline" in einer .hpp oder .h ausschreiben, sprich implementieren.
    Das mache ich bei kleinen Klassen, die nur versch. Member und Setter/Getter haben um einfache Daten zu kapseln. DAfür brauchts keine .cpp :).
    Beispiel:

    class MySimpleData
    {
    private:
       int a;
       float b;
    
    public: 
       int a() const { return a; }
       float b() const { return b; }
    
       setA(int _a) { a = _a; }
       setB(float _b) { b = _b; }
    };
    

    Das ist genauso erlaubt. Das ist nicht so strikt wie in Java.
    rya.



  • Es verwirrt mich nur deswegen, weil in meinen Augen Header-Dateien in gewisser Weise auch eine Klassendefinition, wie die eines Interfaces darstellen.
    Für IVogel habe ich demnach keine Header-Datei, sondern nur eine Cpp-Datei. Ist das so richtig?


  • Administrator

    @Fenixx,
    Wie kommst du jetzt auf *.cpp und *.hpp Dateien? Das hat rein gar nichts mit abstrakt, interface oder sonst was zu tun in diesem Zusammenhang.

    Ganz ehrlich, ich habe ein wenig das Gefühl, dass du den Schwierigkeitsgrad von C++ unterschätzt und denkst, dass du mit deinen Java-Kenntnissen ziemlich weit in C++ kommst. Dem ist aber definitiv nicht so!

    Ich glaube ich empfehle lieber ein Buch. Da du dich schon ein wenig im Programmieren auskennst, wäre wohl diese Lektüre für dich geeignet:
    Die C++-Programmiersprache | ISBN: 382731660X

    Grüssli



  • Fenixx schrieb:

    Es verwirrt mich nur deswegen, weil in meinen Augen Header-Dateien in gewisser Weise auch eine Klassendefinition, wie die eines Interfaces darstellen.
    Für IVogel habe ich demnach keine Header-Datei, sondern nur eine Cpp-Datei. Ist das so richtig?

    Du widersprichst dir selbst hehe.
    IVogel packt man natürlich in einen header. Denn man sollte keine .cpp includen, da das oft zu mehrfach definierten Symbolen führt und User der API verwirren würde.
    Also:
    Interfaces in eine .h/.hpp
    Implementation in eine .cpp
    rya.



  • Danke für eure Ausführungen.
    Jetzt hab ichs verstanden.

    Danke.



  • Zumal du nichtmal auf ".h" angewiesen bist. Du könntest die Datei auch .DasBraucheIchNochWoanders nennen 🙂 Ist halt nur länger 😉



  • Fenixx schrieb:

    Es verwirrt mich nur deswegen, weil in meinen Augen Header-Dateien in gewisser Weise auch eine Klassendefinition, wie die eines Interfaces darstellen.
    Für IVogel habe ich demnach keine Header-Datei, sondern nur eine Cpp-Datei. Ist das so richtig?

    Der Header sollte in der Regel (Ausnahmen sind u.a. Templates, aber das soll dich erst einmal nicht interessieren) die reine Deklaration enthalten, wenn man das mit Java vergleicht würde es am Beispiel einer rein abstrakten Basisklasse bedeuten, das es ähnlich wie eine Javaklasse ohne Methodenrümpfe aussieht (Oder wie ein Java Interface).

    // ivogel.h
    #ifndef IVOGEL_HEADER
    #define IVOGEL_HEADER
    
    class IVogel
    {
        public:
            void fliege() = 0;
    };
    
    #endif
    

    Sofern du keine Abstrakte Klasse betrachtest, sieht es ähnlich aus:

    // bar.h
    #ifndef BAR_HEADER
    #define BAR_HEADER
    
    class Bar
    {
        public:
            void foo();
    };
    
    #endif
    

    Die Implementierung der Methode erfolgt dann in der cpp-Datei:

    // bar.cpp
    #include "bar.h"
    
    //   <---> Dieser Teil steht für die Identifikation der Klasse
    void Bar::foo()
    {
    }
    

    Anmerkung: Destruktoren müssen, sofern man sie deklariert, immer eine Implementierung haben. Im Falle einer Basisklasse würde ich in der Regel einen virtuellen Destruktor zur Verfügung stellen. Häufig wird ein leerer Destruktor direkt in der Headerdatei definiert, und nicht extra dafür eine cpp-Datei erzeugt...

    // ivogel.h
    #ifndef IVOGEL_HEADER
    #define IVOGEL_HEADER
    
    class IVogel
    {
        public:
            virtual ~IVogel() {}; // virtuelle Destruktoren erfordern eine Implementierung
            void fliege() = 0;
    };
    
    #endif
    

    cu André



  • Decimad schrieb:

    Zumal du nichtmal auf ".h" angewiesen bist. Du könntest die Datei auch .DasBraucheIchNochWoanders nennen 🙂 Ist halt nur länger 😉

    😃
    oder .CPlusPlusInterfaceDefinition


Anmelden zum Antworten