[C/C++] Einbinden von .cpp in Headerdateien

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Characticl D, 2. Dezember 2009 .

Schlagworte:
  1. 2. Dezember 2009
    Einbinden von .cpp in Headerdateien

    Hallo Leute,

    ich fange gerade mit OOP an und habe nun zwei Headerdateien definiert, in denen jeweils eine Klasse und zusätzlich die Definitionen der Methoden stehen...

    Nun hat mir mein Chef gesagt, dass man NUR die Klassen in die Headerdatei schreibt und die Methoden extern in einer .cpp-Datei definiert.

    Habe also jetzt folgende Dateien: main.cpp, klasse1.h, klasse2.h, klasse1.cpp und klasse2.cpp.

    In der main.cpp habe ich die beiden Headerdateien eingebunden, um aus ihr ein neues Klassenobjekt anzulegen.

    Meine Frage ist nun:

    Wenn ich in den Headerdateien nur die Klassen habe und in den dazugehörigen .cpps dann die Methoden definiere, dann muss ich doch in den jeweiligen Headerdateien auch die .cpps einbinden.

    Wie geht das?

    Per Google habe ich gefunden, dass man in der jeweiligen .cpp dann einfach die Headerdatei einbinden muss. Das hagelt aber Fehlermeldungen bei mir...


    Wie geht es richtig?
     
  2. 2. Dezember 2009
    AW: Einbinden von .cpp in Headerdateien

    Hoi,

    zuerst mal wäre es natürlich interessat, welche Fehlermeldungen du kriegst. Desweitern includest du eine .cpp Datei niemals.

    Normalerweiße sieht dein Code so aus:
    Code:
    //klasse1.h
    class Klasse1 { void foo(); };
    Code:
    //klasse2.h
    class Klasse2 { void bar();};
    Code:
    //Klasse1.cpp
    #include "Klasse1.h"
    void Klasse1::foo() { return; }
    Code:
    //Klasse2.cpp
    #include "Klasse2.h"
    void Klasse2::bar() { return; }
    Code:
    //main.cpp
    #include "Klasse1.h"
    #include "Klasse2.h"
    
    int main() {
     Klasse1 k1;
     k1.foo();
     Klasse2 k2;
     k2.foo();
    }
    Das hier sollte funktionieren. Der Grund, warum du die .cpp nicht includen musst, liegt darin, dass zuerst Objektdateien vom Compiler erstellt werden und diese anschließend vom Linker zu einer ausführbaren Datei gelinkt werden.

    Der Compiler generiert dabei aus jeder .cpp-Datei eine Objektdatei. Um Klasse1.cpp zu compilen, muss er die genaue Klassendefinition wissen (die ja in klasse1.h steht) und die Definitionen der Funktionen (in Klasse1.cpp). Was sich in Klasse2.cpp abspielt, interessiert den Compiler zur Compilezeit von Klasse1 überhaupt nicht. Wenn main.cpp compiled wird, dann findet der Compiler die Aufrufe zu foo() und bar() (und die zu den Konstruktoren natürlich auch). Da aber die Headerdateien der Klasse eingebunden sind, findet der Compiler die Deklaration der Funktionen. Die Definition braucht er nicht zu kennen, dem Compiler ist es egal, wie die Funktion implementiert ist.
    Insgesamt hast du also 3 Objektdateien: main.o, Klasse1.o, Klasse2.o.
    Der Linker baut daraus eine ausführbare Datei. Da er in main.o Aufrufe zu foo() und bar() findet, ersetzt er die Aufrufe mit den Addresse aus Klasse1.o und Klasse2.o.
     
  3. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.