eigene klasse und funktionen in header und cpp???
-
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 statuskann 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 EXEAlternativ: 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.owenn 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...