Trennung von Klassendeklaration und definition, warum?



  • Ich komme aus der C# Ecke und beschäftige mich nun wieder mehr mit C++.
    Dabei ist etwas das mich an C++ schon immer gestört hat die Trennung der Klassendeklaration und der Klassendefinition, bzw. deren Methoden.

    In C# und auch Java hat man das nicht, man definiert gleich die Methoden der Klassen.
    Aber irgendwas muss sich der Herr Stroustrup ja dabei gedacht haben, dies zu trennen und damit mehr Schreibaufwand in kauf zu nehmen, obwohl man ja mit C++ ja genau das nicht haben sollte.

    PS: Wobei mein C++-Compiler (g++) sich nicht beschwert wenn ich die Methoden gleich in der Klasse definiere.

    PPS: Ja ich weiß das C++ "etwas" älter ist als Java & C#.



  • InvaderMustDie schrieb:

    ... Trennung der Klassendeklaration und der Klassendefinition, bzw. deren Methoden ...

    $ Ermöglicht die Nutzung von Librarys ohne das deren Quelltext vorliegen muß. $

  • Administrator

    Zur Trennung:
    Der Kompiler muss nur die Deklaration kennen, der Linker braucht die Definition. Das heisst, dass du von einer Library oder einem anderen Modul, nur die Deklaration einbinden musst, also den Header. Dem Linker muss dann mitgeteilt werden, wo sich die entsprechende Definition befindet. Dies kann eben eine Bibliothek sein oder ein Object-File.

    "Moderne Sprachen" gehen da eben etwas anders vor. Sind aber meistens auch nicht so komplex wie C++, können daher leichter und vor allem schneller gelesen und übersetzt werden.

    InvaderMustDie schrieb:

    PS: Wobei mein C++-Compiler (g++) sich nicht beschwert wenn ich die Methoden gleich in der Klasse definiere.

    Dies nennt man eine inline Definition. Kann man auch mit freien Funktionen machen, wobei man dann das Schlüsselwort inline verwenden muss.

    Grüssli

    PS: Ich mag die Trennung. So ein Header kann einem einen sehr guten Überblick geben.



  • dagobertdagobert schrieb:

    InvaderMustDie schrieb:

    ... Trennung der Klassendeklaration und der Klassendefinition, bzw. deren Methoden ...

    $ Ermöglicht die Nutzung von Librarys ohne das deren Quelltext vorliegen muß. $

    Das geht auch wenn die nötigen "Type-Infos" in der Library vorliegen. Was in C# z.B. der Fall ist. Da bekommt man auch nicht zu allem was so verkauft wird den Quelltext.

    @InvaderMustDie:
    Wenn du schon weisst dass C++ alt ist, wieso fragst du dann? Es gibt dafür ca. 100 Gründe. Und wie du schon bemerkt hast: du kannst ja alles "inline" implementieren. Das stört nicht nur GCC nicht, das ist sogar laut Standard ganz offiziell OK. Also, foz se Probleim?



  • InvaderMustDie schrieb:

    PS: Wobei mein C++-Compiler (g++) sich nicht beschwert wenn ich die Methoden gleich in der Klasse definiere.

    Da wirst du früher oder später in C++ Probleme bekommen (Spätestens wenn zwei Klassen sich gegenseitig kennen müssen).



  • Hi,

    als weiteren (und in meinen Augen wesentlichen) Vorteil möchte ich "einfache Entkopplung von Schnittstelle und Implementation" anbieten: Man sieht bereits über einen einfachen File-Vergleich (und sei es nur das Änderungsdatum), ob sich die Schnittstelle geändert hat oder nur die Implementation.
    Natürlich kann man das auch über einen Sprachparser feststellen, aber spätestens wenn die Implementierung includes braucht, die nicht Teil der Schnittstelle sind, wird die Trennung recht kniffelig.

    ... und letztlich spart man Compilezeit, wenn ich vorkompilierte Implementationen einbinden kann.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    als weiteren (und in meinen Augen wesentlichen) Vorteil möchte ich "einfache Entkopplung von Schnittstelle und Implementation" anbieten: Man sieht bereits über einen einfachen File-Vergleich (und sei es nur das Änderungsdatum), ob sich die Schnittstelle geändert hat oder nur die Implementation.

    Überhaupt kann man das Interface der Klasse - zumindest in gutem Code - auf Anhieb überschauen.

    In C# und Java braucht man für so etwas eine IDE mit Code-Folding. Und auch das natürlich nur, sofern man den Quelltext überhaupt hat, sonst muß man gleich den Reflector heranziehen 👎


Anmelden zum Antworten