hubibi Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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:: ? Zitieren
MAJOR_TOM Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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. Zitieren
hubibi Geschrieben 31. Januar 2005 Autor Geschrieben 31. Januar 2005 ok und welche datei muss ich dann zuerst kompilieren? Oder kann ich header Dateien gar nicht komplilieren? Zitieren
MAJOR_TOM Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 Header Dateien alleine lassen sich nicht kompilieren. Du musst die .cpp Datei kompilieren. Den Rest macht der Compiler automatisch. Zitieren
hubibi Geschrieben 31. Januar 2005 Autor Geschrieben 31. Januar 2005 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: Zitieren
MAJOR_TOM Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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... Zitieren
bigpoint Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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. Zitieren
Klotzkopp Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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. Zitieren
MAJOR_TOM Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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? Zitieren
bigpoint Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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!! Zitieren
MAJOR_TOM Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 Glaubs oder glaubs nicht... Warum sollte ich dich denn anlügen? Zitieren
bigpoint Geschrieben 31. Januar 2005 Geschrieben 31. Januar 2005 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. Zitieren
hubibi Geschrieben 1. Februar 2005 Autor Geschrieben 1. Februar 2005 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 Zitieren
Freshman Geschrieben 1. Februar 2005 Geschrieben 1. Februar 2005 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!!! Zitieren
Klotzkopp Geschrieben 1. Februar 2005 Geschrieben 1. Februar 2005 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!!! Zitieren
Code Poet Geschrieben 1. Februar 2005 Geschrieben 1. Februar 2005 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. Zitieren
.vash Geschrieben 4. Februar 2005 Geschrieben 4. Februar 2005 viel interessanter wäre die Frage ob man eine kompilierte Headerdatei ohne Defintion auch linken kann Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.