eigene klasse und funktionen in header und cpp???



  • hi
    ich lese gerade ein buch über c++, bin also noch anfänger.
    ich bin noch nicht bei den präprozesser direktiven angekommen und kenne nur include,define und typedef.

    in dem buch wurde schon die ganze zeit geschrieben, dass man seine deklarationen in eine header datei schreiben soll und die definitionen in eine cpp datei.
    es gibt kein kapitel in dem buch, dass das ganze erklärt, d.h. wie man die includes und so aufbaut und so seine eigene klasse in einem neuen projekt verwendet.

    deshalb poste ich hier (ich hab bei der suche nicht genaues gefunden)...
    könnt ihr mir möglichst einfach erklären, wie ich eine eigene klasse oder eine eigene funktion in extra header und cpp dateien schreibe und diese dann in einer neuen datei verwende?

    was muss ich wo includen, da man ja die standard dateien auch nur als header einbindet.
    ich hatte es mir so gedacht, dass ich die cpp datei mit den definitionen in die header datei mit den deklarationen inkludiere und die header datei dann in meinem hauptprogramm, wo ich die klasse etc. verwenden will. liege ich damit richtig?

    ich verwende dev-c++ zum kompilen und linken. ich könnte natürlich einfach eine projektdatei erstellen und dort meine header etc. hinzufügen, aber ich will das halt per hand machen, wenns nicht zu schwer ist.
    muss ich dazu selber kompilieren und linken oder geht das auch mit der ide und selbst erstellten header und cpp dateien?

    ich hoffe das waren jetzt nicht zuviele fragen...
    danke im voraus...
    amateur



  • Amateur schrieb:

    hi
    ich lese gerade ein buch über c++, bin also noch anfänger.
    ich bin noch nicht bei den präprozesser direktiven angekommen und kenne nur include,define und typedef.

    in dem buch wurde schon die ganze zeit geschrieben, dass man seine deklarationen in eine header datei schreiben soll und die definitionen in eine cpp datei.
    es gibt kein kapitel in dem buch, dass das ganze erklärt, d.h. wie man die includes und so aufbaut und so seine eigene klasse in einem neuen projekt verwendet.

    deshalb poste ich hier (ich hab bei der suche nicht genaues gefunden)...
    könnt ihr mir möglichst einfach erklären, wie ich eine eigene klasse oder eine eigene funktion in extra header und cpp dateien schreibe und diese dann in einer neuen datei verwende?

    was muss ich wo includen, da man ja die standard dateien auch nur als header einbindet.
    ich hatte es mir so gedacht, dass ich die cpp datei mit den definitionen in die header datei mit den deklarationen inkludiere und die header datei dann in meinem hauptprogramm, wo ich die klasse etc. verwenden will. liege ich damit richtig?

    ich verwende dev-c++ zum kompilen und linken. ich könnte natürlich einfach eine projektdatei erstellen und dort meine header etc. hinzufügen, aber ich will das halt per hand machen, wenns nicht zu schwer ist.
    muss ich dazu selber kompilieren und linken oder geht das auch mit der ide und selbst erstellten header und cpp dateien?

    ich hoffe das waren jetzt nicht zuviele fragen...
    danke im voraus...
    amateur

    typedef ist KEINE Präprozessor-Direktive.

    Du schreibst in die Header-Datei die Deklaration deiner Klasse bzw. Funktionen
    und die Implementierung deiner Klasse bzw. Funktionen in eine Source-Datei.
    Die Header-Datei musst du dann im "Kopf" deiner Source-Datei inkludieren.
    Das müsste genügen um deine Klasse bzw. Funktionen erfolgreich zu kompilieren.

    Damit du deine Klasse bzw. Funktionen auch in anderen Source-Dateien verwenden
    kannst, musst du dort dann jeweils die Header-Dateien inkludieren. Die Imple-
    mentierung wird als Object-Datei in das Projekt eingebunden. Dieses geschieht
    üblicherweise durch das "Einbinden" der Object-Datei in das Projekt, durch die
    jeweilige IDE oder auch durch explizite Angabe im makefile.



  • Redhead schrieb:

    Die Imple-
    mentierung wird als Object-Datei in das Projekt eingebunden. Dieses geschieht
    üblicherweise durch das "Einbinden" der Object-Datei in das Projekt, durch die
    jeweilige IDE oder auch durch explizite Angabe im makefile.

    mhh und wie mache ich das mit der Angabe im makefile. wie ich mit dev-cpp eine obj-datei erzeuge werd ich noch rausfinden, aber wie binde ich die dann in mein hauptprog ein? über include binde ich ja nur header dateien ein oder geht das auch damit?



  • in der header dateien stehen die definitionen der klassen. nur die müssen während des compilevorgangs zur verfügung stehen. erst der linker sucht sich die implementationen zusammen und dafür guckt er erstmal in alle ".o" dateien, die zum programm gehören (also im makefile angegeben sind).

    es reicht also aus, nur die header ".h" datei zu inkludieren. der linker sorgt dann dafür, dass auch die implementation gefunden wird.



  • als um das nochmal zusammenzufassen:
    ich schreibe mir eine klasse katze.
    die deklaration

    //meinheader.h
    class katze
    {
    int getalter() const;
    };
    

    schreibe ich in eine header datei.

    dann schreibe ich die definition:

    int katze::getalter() const
    {
    return...
    };
    

    in eine cpp datei.

    die cpp datei compile ich dann und bekomme eine .obj datei.

    um nun die klasse katze zu benutzen schreibe ich in meine main cpp datei:

    #include "meinheader.h"
    

    würde das ausreichen oder was muss ich sonst noch machen damit meine klasse in der main datei verwendet werden kann?

    ich will kein projekt erstellen, sondern die dateien alle so schreiben.
    ich nutze dafür dev-c++.
    und wenn ich da die cpp dateien compile und ausführe hab ich ja nur die cpp datei und ne exe (die obj datei werde ich noch irgendwie hinbekommen)
    von daher weiß ich nicht was das makefile ist und ob ich noch was zusätzlich machen muss oder ob das reicht was ich oben geschrieben hab....
    danke...



  • Eventuell wäre es noch eine gute Idee, die Methode getalter() als public zu deklarieren, sonst darf niemand anderes sie verwenden 😉 Und in deiner CPP solltest du auch ein #include "meinheader.h" ergänzen

    Ansonsten reicht dein Beispiel aus, um etwas weiterverwertbares zu erzeugen. (btw, der Compiler nimmt die CPP (nachdem der Präprozessor drübergegangen ist und unter anderem Header eingesetzt und Makros expandiert hat) und baut daraus eine OBJ - der Linker nimmt sich alle OBJ (also die mit der katze-Klasse und die vom Hauptprogramm) und verarbeitet sie zu einer EXE)



  • hi ich hab mir jetzt mal nen simples hello world ding gebastelt, nur um zu testen wie das mit den header und cpp dateien abläuft.
    hab in meiner header folgendes:

    class hallo
    {
      public:
      void hello() const;
    };
    

    in der zugehörigen cpp:

    #include "unbenannt1.hpp"
    #include <iostream>
    
    void hallo::hello() const
    {
    std::cout<<"hallo";
         };
    
         int main() // muss ich die main fkt reinpacken auch wenn nur
    //definitionen in der cpp stehen
         {
             }
    

    und in meinem hauptprogramm versuch ich so zuzugreifen:

    #include "unbenannt1.hpp"
    
    int main()
    {
    hallo hi;
    hi.hello();
    return 0;
        }
    

    ich hab es noch nicht hinbekommen eine obj-datei zu erzeugen. vielleicht liegts daran, jedenfalls bekomme ich beim kompilieren von der hauptdatei die folgenden fehler:

    [Linker error] undefined reference to `hallo::hello() const'
    ld returned 1 exit status

    kann mir jemand sagen was ich falsch gemacht hab? welche dateien müsste ich wie erzeugen? ich hab mal versucht die cpp datei mit den definitionen auf die ganzen exe dateien wie c++.exe oder gcc.exe zu ziehen um so eine obj datei zu erzeugen aber das funktioniert auch nicht.
    ich nutze dev-c++.
    wie bekomme ich nun zugriff auf meine hallo klasse?
    danke!!!



  • Du hast genau das nicht gemacht was CStoll Dir zuletzt beschrieben hat 😉

    Der Linker muss alle obj-Dateien zu einer EXE-Datei verbinden. Und Dein int main {} in der katze.cpp ist auch fehl am Platz, welche main soll er denn später starten? Die, die in der fertigen EXE weiter vorne steht? Beide? Sollen sie sich duellieren? 😉

    Also: Aus jeder CPP wird ein OBJ
    Aus allen OBJ wird genau eine EXE

    Alternativ: Aus allen CPP wird eine EXE (in einem Rutsch, ohne OBJ-Schritt)

    Sowas machst Du über den Aufruf des Compilers (z.B.: einfach alle .cpp Dateien angeben statt nur einer) oder mit einem Projekt in der IDE (ja, dafür sind Projekte da 😉 ).



  • Amateur schrieb:

    in der zugehörigen cpp:

    #include "unbenannt1.hpp"
    #include <iostream>
    
    void hallo::hello() const
    {
    std::cout<<"hallo";
         };
         
         int main() // muss ich die main fkt reinpacken auch wenn nur
    //definitionen in der cpp stehen
         {
             }
    

    In die zu einer Klasse gehörenden CPP-Datei kommen hauptsächlich (evtl. auch noch andere Sachen) die Methodendefinitionen (bzw. Funktionsdefinitionen) der Klasse. Da kommt eigentlich keine main-Funktion rein. Außerdem werden auch die Rümpfe von Methoden nur durch '}' geschlossen und nicht durch "};".

    #include "unbenannt1.hpp"
    #include <iostream>
    
    void hallo::hello() const
    {
      std::cout<<"hallo";
    }
    


  • Beispiel:

    Datei katze.h:

    class Katze
    {
        unsigned alter;
      public:
        Katze();
        unsigned getAlter() const;
        viod setAlter(unsigned alter);
    };
    

    Datei katze.cpp:

    #include "katze.h"
    Katze::Katze()
      : alter(0)
    {
    }
    
    unsigned Katze::getAlter() const
    {
      return alter;
    }
    
    void Katze.setAlter(unsigned alter_)
    {
      alter = alter_;
    }
    

    Datei haupt.cpp

    #include "katze.h"
    #include <iostream>
    
    int main(int argc, char* argv[])
    {
      Katze k;
      k.setAlter(5);
      std::cout << "Das Alter der Katze ist " << k.getAlter() << std::endl;
    }
    

    Dann auf die Kommandozeile folgendes ausführen:

    g++ -c katze.cpp
    g++ -c haupt.cpp
    g++ -o haupt katze.o haupt.o
    

    Mit dem Schalter '-c' sagst Du Deinem Compiler, er soll keine ausführbare Datei erzeugen, sondern nur die Objekt-Datei. Die ersten beiden Kommandos erzeugen also jeweils katze.o und haupt.o. Die letzte Zeile bindet die beiden Programmteile zu einem Programm mit dem Namen haupt zusammen.

    So geht das zumindest unter Linux. Bei M$ muß ein Programm die Endung exe haben, obwohl das Programm dann ohne Endung aufgerufen wird. Ich nehme an, Du mußt den Compiler dann mit "g++ -o haupt.exe katze.o haupt.o" aufrufen.

    Tommi



  • ...wobei sich bei dir (dev-c++) auch die Kommandos und Optionen unterschieden können.
    Aber das Prinzip sollte im Beispiel klar geworden sein.
    Wichtig sind die zwei separaten Schritte: Kompilieren und Linken.
    Die Header-Dateien finden dabei nur in der Kompilier-Phase Verwendung.
    Zum Linken müsen die Einzelstücke nochmal entweder direkt angegeben werden (wie im Beispiel) oder die Information kommt aus einer Projekt-Datei.



  • ähm, ich weiss nicht, ob dir das jetzt weitergeholfen hat, was bisher kam...

    wenn du mit dev-cpp mehrere files kompilieren und linken willst, kommst du nicht drumrum ein project zu machen!

    wenn du das nicht willst musst du in der kommandozeile das machen was tntnet geschrieben hat, nämlich:
    g++ -c katze.cpp
    g++ -c haupt.cpp
    g++ -o haupt katze.o haupt.o

    wenn du ein projekt in dev-cpp machst musst du dort deine main.cpp und wenigstens die katze.cpp einfügen.
    dev-cpp führt dann die oben beschriebenen kommandos unsichtbar im hintergrund aus und das ergebniss ist dasselbe...
    und du kannst dann deine anwendung ausserdem noch über dev-cpp starten...


Anmelden zum Antworten