Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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:: ?

Geschrieben

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.

Geschrieben

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:

Geschrieben

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... :D

Geschrieben
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.

Geschrieben
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.

Geschrieben

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!!

Geschrieben

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

Geschrieben

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!!!

Geschrieben
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!!!

:rolleyes:

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...