Veröffentlicht 31. Januar 200520 j Hi, ich hab mich gestern mal über Klassen schlau gemacht und zwar hier: http://highscore.de/cpp/aufbau/klassen.html#3 dort steht das ich in Klassen Methoden festlegen kann, es aber üblich ist das die eigentliche Methode dann in einer anderen Datei liegt. z.B. Kunde.h #include <string> using namespace std; class MeineKlasse { string wasweißich; public: int meineMethode(); }; Die Methode soll dann aber in einer anderen Datei liegen z.B. Kunde.cpp #include "kunde.h" #include <iostream> #include <string> using namespace std; int kunde::meineMethode(); { // Meine Methode.... }; Jetzt meine Frage: Woher weiß die Datei Kunde.h wo die Methode steht, die kann doch nicht zaubern? Und kann ich wenn ich using namespace std; angeben hab, bei bedarf durch kunde:: auf andere methoden wechseln oder übersetzt der Compiler des dann so ungefähr: std::kunde:: ?
31. Januar 200520 j Umgekehrt: Die Datei "Kunde.h" weis nicht, wo die Methode steht, sondern die Datei "Kunde.cpp" weiss es durch die Anweisung #include "kunde.h". Die beiden Dateien werden vom Compiler quasi aneinandergehängt und wie eine Datei behandelt.
31. Januar 200520 j ok und welche datei muss ich dann zuerst kompilieren? Oder kann ich header Dateien gar nicht komplilieren?
31. Januar 200520 j Header Dateien alleine lassen sich nicht kompilieren. Du musst die .cpp Datei kompilieren. Den Rest macht der Compiler automatisch.
31. Januar 200520 j Erstellt er mir dann auch eine neue Header Datei? weil ich die klasse ja in einer dritten Datei benutzen möchte und in diese füge ich ja nur die header datei ein...und die weiß ja nichts von der kunde.cpp Also müsste der kompiler mir doch eine neue header datei aus der kunde.cpp erstellen :confused:
31. Januar 200520 j Also: Eine neue Header Datei wird nicht erstellt. Wie schon gesagt => Der Compiler erkennt selbstständig, welche Quellcode Datei er mit einbinden muss wenn du die Header Datei includierst. Frag mich jetzt nicht, wie genau das im einzelnen funktioniert. :confused: Nimm es einfach als gottgegebenes Geschenk, dass der Compiler so intelligent ist...
31. Januar 200520 j Header Dateien alleine lassen sich nicht kompilieren. Du musst die .cpp Datei kompilieren. Den Rest macht der Compiler automatisch. das stimmt nicht so ganz. Wie kommst du eigentlich drauf ?? Natürlich lassen sich header Dateien alleine kompilieren.
31. Januar 200520 j Natürlich lassen sich header Dateien alleine kompilieren. Aber es ist nicht sinnvoll. Der Sinn von Headerdateien ist der, dass sie mittels include-Direktive in Quellcodedateien eingebunden werden. Die werden dann kompiliert.
31. Januar 200520 j Ich komme darauf, weil mein Compiler (Visual C++ 6.0) mir eine Fehlermeldung bringt, wenn ich versuche eine .h Datei zu kompilieren. Kann natürlich auch sein, dass das compilerspezifisch ist?
31. Januar 200520 j Aber es ist nicht sinnvoll Sicherlich ist es schlechter design, darum geht es aber nicht Ich komme darauf, weil mein Compiler (Visual C++ 6.0) mir eine Fehlermeldung bringt, wenn ich versuche eine .h Datei zu kompilieren Das glaube ich nicht!!
31. Januar 200520 j Nein das habe ich auch nicht behauptet. Was ich vermute ist, dass diese Fehlermeldung der dir dein Compiler liefert von wo anderes kommt als davon, dass du eine .h Datei versuchst zu kompilieren.
1. Februar 200520 j hmm ok, also ich habs etz hinbekommen, meine ganze Dateien müssen alle in meinem Projekt angelegt sein. Dann ist es auch logisch, ich dacht nur wenn ich X Dateien unabhängig von einander schreibe weiß der kompiler ja gar nicht was zu wem gehört und welche dateien etz dazu gehören.... Danke
1. Februar 200520 j Das ist natürlich total humbug, dass eine Headerdatei auch nur irgendwie kompiliert wird. Wie soll denn das gehen??? Es läuft so ab: in einer .cpp oder .c Datei steht ein In diesem Beispiel in der Error.cpp #include Error.h [/php] dieses kopiert der Präprozessor dann in die Error.cpp Datei, die included hat. (Das tut er nebenbei bis er alle befehle abgearbeitet hat, und zwar von oben bis unten.) Das nennt man das Forwarding! Dies bezweckt, dass ich eine Funktion auifrufen kann, obwohl ich sie selbst noch nicht beklariert habe. Wenn er damit fertig ist, dann kommt der Kompieler. Aber woher weiß mein Kompieler dann, wo die Funktion ist, die er in der Headerdatei stehen hat? Das ist relativ einfach. Ein Compiler gibt jeder Funktion nach dem Namen eine Eindeutige kennung beim Kompilieren. [php| Z.B so: iLinkError@Error@@QAEXHH@Z Diese Funktion lautet : void LinkError(int i, int y); So sieht es z.B. auch aus, wenn ein Kompiler ein nichtaufgelöstes externes Symbol ausgibt. "public: void __thiscall Error::LinkError(int,int)" (?LinkError@Error@@QAEXHH@Z) [/php] Später tauchen diese Namen dann in so genannten .lib oder auch .dll Datein auf. [b]Dennoch wird aber nie eine Headerdatei kompiliert, nein sie ist eher ein inhaltsverzeichniss, die vor die .cpp Datei gehängt ist, da #include ja eindeutig eine Präprozessor Anweisung ist. [/b] wenn etwas nicht verständlich war, einfach nachfragen!!!
1. Februar 200520 j Das ist natürlich total humbug, dass eine Headerdatei auch nur irgendwie kompiliert wird. Wie soll denn das gehen???Über die Projektverwaltung einer IDE, über die Kommandozeile, da gibt es mehrere Möglichkeiten. Dem Compiler ist die Dateierweiterung ziemlich egal. Das nennt man das Forwarding!Vermutlich meinst du Prototyping. Das hat aber nichts mit der Verteilung auf Header- und Quellcodedateien zu tun. Dies bezweckt, dass ich eine Funktion auifrufen kann, obwohl ich sie selbst noch nicht beklariert habe.Eine undeklarierte Funktion kannst du nur in C aufrufen. Wenn er damit fertig ist, dann kommt der Kompieler. Aber woher weiß mein Kompieler dann, wo die Funktion ist, die er in der Headerdatei stehen hat? Der Compiler sieht in dem von dir beschriebenen Szenario gar nichts von der Headerdatei. Er sieht nur die Ausgabe des Präprozessors. Das ist relativ einfach. Ein Compiler gibt jeder Funktion nach dem Namen eine Eindeutige kennung beim Kompilieren. [php| Z.B so: iLinkError@Error@@QAEXHH@Z Diese Funktion lautet : void LinkError(int i, int y); [/php] So sieht es z.B. auch aus, wenn ein Kompiler ein nichtaufgelöstes externes Symbol ausgibt. [php] "public: void __thiscall Error::LinkError(int,int)" (?LinkError@Error@@QAEXHH@Z) Äh, was hat die Namensdekoration jetzt mit Headerdateien zu tun? Später tauchen diese Namen dann in so genannten .lib oder auch .dll Datein auf. Ich glaube, du wirfst da einiges durcheinander. Dennoch wird aber nie eine Headerdatei kompiliert, nein sie ist eher ein inhaltsverzeichniss, die vor die .cpp Datei gehängt ist, da #include ja eindeutig eine Präprozessor Anweisung ist. Wie gesagt, das ist die übliche (und einzig sinnvolle) Vorgehensweise. Aber das bedeutet nicht, dass man Headerdateien nicht kompilieren kann. wenn etwas nicht verständlich war, einfach nachfragen!!!
1. Februar 200520 j Headerdateien werden natürlich mitkompiliert. Im Grunde sind sie ja nur ein organisatorisches Werkzeug, um den Überblick zu behalten! Wenn man eine Datei mit INCLUDE einbindet, dann ist es so, als hätte man ihren Inhalt an dieser Stelle per Copy/Paste eingefügt. Im Falle von Klassen macht man es eben zumeist so, dass man in eine Datei Klassenname.h die Klassendefinition (also die Schablone) programmiert und in eine zweite Datei Klassenname.cpp ganz oben die .h-Datei einbindet und dann die dort deklarierten Klassenmethoden definiert/implementiert.
4. Februar 200520 j viel interessanter wäre die Frage ob man eine kompilierte Headerdatei ohne Defintion auch linken kann
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.