Trennung von Deklaration und Implementierung



  • Hallo,

    wenn man eine Klasse deklariert macht man das in einer .h Datei ;
    Die Implementierung der Methoden erfolgt in einer .cpp Datei.
    Hat dies den Hintergrund dass einem User später mal nur die .h DAtei
    zur Verfügung gestellt wird, aber nicht die . cpp Datei in der
    die Implementierung beschrieben ist ? Den User hat nur die Funktionalität
    zu intressieren aber nicht wie diese "geschaffen" wurde.

    Danke


  • Mod

    Das ist ein Aspekt, aber die Hauptmotivation ist die, dass es daurch viel einfacher ist, das Programm in verschiedene Übersetzungseinheiten einzuteilen. Benötigt eine Einheit Teile aus einer anderen, so reicht es bei der Übersetzung die Deklaration zur Verfügung zu haben.



  • blurry333 schrieb:

    Hallo,
    wenn man eine Klasse deklariert macht man das in einer .h Datei

    Klassen können natürlich auch deklariert werden. Man definiert sie aber in der Regel und ich glaube das ist auch das, was Du meinst.

    Hier mal ein kurzer Abriss bzgl Deklaration vs Definition und Bindung:

    class A; // Klassen-Deklaration
    
    class A  // Klassen-Definition
    {
      int dings;
    public:
      A();   // Konstruktor-Deklaration
      void foo();    // foo-Deklaration
    };
    
    A::A()      // Definition des Konstruktors
    : dings(23)
    {}
    
    void A::foo() // Definition von A::foo
    {}
    

    Deklarieren kann man soviel und so oft, wie man will. Hauptsache die Deklarationen sind konsistent und widersprechen sich nicht. Eine Definition für etwas darf nur einmal in einer Übersetzungseinheit stehen. Einunddieselbe Definition von Klassen, Klassen-Templates, statische Elemente von Klassen-Templates, Inline-Funktionen und Funktions-Templates darf auch in mehreren Übersetzungseinheiten gleichzeitig auftauchen, ohne dass der Linker sich beschweren würde. Er schmeißt "Duplikate" einfach raus. Dies gilt nicht für "normale" Funktionen und "normale" Variablen/Objekte. Duplikate habe ich in Anführungszeichen gesetzt, weil der Linker hier keine Überprüfung macht und sich auf den Programmierer verlässt. Es ist also eine sehr schlechte Idee, inkonsistente Definitionen (über versch. Ü-Einheiten) zu benutzen.

    Dann gibt es noch Klassen, Funktionen und Objekte, die eine interne Bindung besitzen. Interne Bindung bedeutet quasi, dass die Entität mit interner Bindung sich nie auf etwas bezieht, was in einer anderen Übersetzungseinheit denselben Namen bekommen hat -- es kann daher euch keine Mehrfachdefinitionen geben, weil sich jede Definition auf etwas anderes bezieht. Interne Bindung hat eine auf Namensraum deklarierte Entität nur, falls sie entweder
    - mit static deklariert wurde (für Objekte und Funktionen),
    - in einem anonymen Namensraum deklariert wurde oder
    - mit const aber ohne extern deklariert wurde (Konstanten)

    (Alle Angaben ohne Gewähr. Für mehr Details siehe ISO C++ Standard) 😉

    hoffe, ich war hilfreich,
    Sebastian



  • Auch wenn es nicht 100% auf die Frage passt, verweise ich mal kurz auf meinen Blog, wo ich letztens einen Beitrag über Deklarationen/Definitionen geschrieben habe. Könnte dich in dem Kontext auch noch interessieren:

    http://drakon.ch/

    ~(Beitragsverweise habe ich leider noch nicht in die Seite integriert. Siehe Beitrag vom 19.10.09)~


Anmelden zum Antworten