Andy133 Geschrieben 20. Mai 2008 Geschrieben 20. Mai 2008 Hallo liebe Communty Ich bin neu hier und bringe direkt mal eine Frage mit. Für alle wahrscheinlich eine absolute beginner Frage, aber wie es nunmal so ist, nur sprechenden Menschen kann geholfen werden . Ich habe vor einiger Zeit mit C++ angefangen und habe immer noch Probleme wenn ich mit mehreren Datei endungen arbeite. Sprich zb. mit zwei .cpp Dateien und eine .hpp Datei. Ich weiß nicht so richtig wie das funktioniert , hat jemand für mich ein kleines Beispiel was 2 CPP Dateien und eine Header Datei verwendet ? Es würde mir sehr beim Verständnis helfen da ich noch nicht richtig mit der Benutzung umgehen kann. Ich weiß zwar wie ich eine Header Datei einbinde aber nicht wie ich diese auch sinnvoll benutzen kann. Bin für jede Hilfe und Erläuterung Dankbar. Ein einfaches Codebeispiel wäre echt Klasse. Gruß Andy133 Zitieren
Panke Geschrieben 20. Mai 2008 Geschrieben 20. Mai 2008 (bearbeitet) Hallo, das scheint bei Anfängern häufiger Probleme zu machen. Wichtig ist, dass du den Unterschied zwischen einer Definition und einer Deklaration verstehst. Damit man aber in verschiedenen Übersetzungseinheiten (d.h. versch. .cpp-Dateien) die selbe Funktion benutzen kann, ohne sie in beiden definieren zu müssen, hat man Header erfunden. In Headern steht i.d.R. nur eine Deklaration. Daher kann man sie problemlos in beliebig viele .cpp-Dateien einbinden (Stichwort ODR, Wartbarkeit). Also: 1. Definieren in .cpp, deklarieren in .hpp 2. Niemals #include <foo.cpp> 3. Denke an die Include-Wächter. Beispiel Bearbeitet 20. Mai 2008 von Panke Zitieren
Andy133 Geschrieben 20. Mai 2008 Autor Geschrieben 20. Mai 2008 (bearbeitet) Hallo, danke für die Antwort. Das hat mir jetzt auch geholfen, nur leider habe ich wohl noch ein Verständnis Problem mit den Parametern was ich selber mit folgenden Problem lösen wollte. Prinzip ganz einfach : Die Main ( in der main.cpp ) hat 2 Int die ich beiden einen Wert ( Wert1 und Wert2 ) zugewiesen habe. Diese beiden Werte sollen in der rechnung.cpp addiert und an die Funktion "ausgaben" übergeben werden die dann die ausgabe mit cout auf der Konsole ausgibt. Das ganze sprich die Funktion und die Methode hab ich nun mit in die Main gepackt damit es halt nach der Reihe durchgearbeitet werden kann. Nur leider funktioniert das nicht, und nach 1 Stunde rumprobieren komme ich immer noch auf keine Lösung. Ich denke mal das dieses Problem viel einfacher zu lösen ist. Wichtig ist mir nur, das die main.cpp über die rechnung.hpp mit der rechnung.cpp kommuniziert. main.cpp #include <iostream> #include "sammlung.hpp" using namespace std; int main() { int Wert1 = 10; int Wert2 = 20; Rechnung(int Wert1, int Wert2); ausgaben(); system("pause"); return 0; } rechnung.hpp int Rechnung(int Summand1, int Summand2); void ausgaben(int ergebnis); rechnung.cpp #include "sammlung.hpp" #include <iostream> using namespace std; int Rechnung(int Wert1, int Wert2) { public: int ergebnis; ergebnis = Wert1 + Wert2; return 0; } void ausgauben( int ergebnis ) { cout << ergebnis << endl; } Ich bin mir sicher das der ganze Code einen kompletten Parameter Fehler hat. Vielleicht wäre jemand so freundlich ihn zu korrigieren damit ich mir genau angucken kann, wie es eigentlich von statten geht. Bestimmt ist das "Public:" in der Rechung() auch überflüssig. Dabei wollte ich nur sicher gehen das ich es in der Funktion auch benutzen kann. Bin mir jetzt garnicht mehr sicher ob man das überhaupt machen muss. BIn über jede Hilfe dankbar. Gruß Andy133 Bearbeitet 20. Mai 2008 von Andy133 Zitieren
TDM Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 (bearbeitet) ähm, ja. guckst du: main.cpp: #include <iostream> #include "sammlung.hpp" using namespace std; int main() { [INDENT]int Wert1 = 10; int Wert2 = 20; [COLOR="red"]int ergebnis =[/COLOR] Rechnung(int Wert1, int Wert2); //<-- Ergebnis sollte man schon speichern ausgaben([COLOR="red"]ergebnis[/COLOR]); // <-- und auch ausgeben. system("pause"); return 0;[/INDENT] } rechnung.cpp: #include "sammlung.hpp" #include <iostream> using namespace std; int Rechnung(int Wert1, int Wert2) { [INDENT][COLOR="red"]return Wert1 + Wert2;[/COLOR] <-- wir wollen ja nicht immer 0 zurückgeben. [/INDENT] } void [COLOR="red"]ausgaben[/COLOR]( int ergebnis ) //<-- war ein 'u' zu viel. { [INDENT]cout << ergebnis << endl;[/INDENT] } Bearbeitet 21. Mai 2008 von TDM Zitieren
Panke Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Die Idee mit globalen Variablen zu arbeiten - und das ist dieses 'Datei1 kommuniziert mit Datei2' - würd ich mal ganz schnell wieder vergessen. Das führt nur zu Spaghetti-Code. So macht man das: //main.cpp #include <rechnung.hpp> int main() { int a, b, result; result = rechnung(a, ; ausgabe(result); } //rechnung.hpp //niemals using direktiven im header //und nur deklarationen hier int rechnung(int, int); void ausgabe(int); //rechnung.cpp #include <iostream> #include "rechnung.hpp" int rechnung(int a, int { return a + b; } void ausgabe(int a) { std::cout << a << "\n"; } [/PHP] Zitieren
TDM Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 int a, b, result; result = rechnung(a, ; [/PHP] Das würd ich aber auch nicht machen. a und b nur zu deklarieren und nicht zu initialisieren, kann zu verheerenden Fehlern kommen. Zitieren
Panke Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Das Ergebnis ist nicht definiert. Ist aber für dieses Beispiel völlig irrelevant. Zitieren
Andy133 Geschrieben 21. Mai 2008 Autor Geschrieben 21. Mai 2008 Vielen Vielen Dank. Jetzt wo ich eine Nacht darüber geschlafen habe, erscheint mir das auch alles viel plausibler. Ich danke euch für die Beispiele, ich steige endlich hinter. Gruß Andy133 Zitieren
TDM Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Ich müsste allerdings noch anmerken, dass ich hpp-Dateien so gut wie nie sehe. In C sind Headerdateien meistens .h und in C++ meist ohne Endung. (Nennt mich altmodisch, aber das ist mir die einzige geläufige Konvention) Zitieren
Panke Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Für C kenne ich eigentlich nur .h Für C++ kenne ich .h und .hpp. Letzteres vorallem bei der Boost-Bibliothek. Ohne Endung kenne ich bei C++ gar nicht. Zitieren
Klotzkopp Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Ohne Endung kenne ich bei C++ gar nicht.Die Headerdateien der C++-Standardbibliothek haben keine Dateierweiterung. Bei Nicht-Standard-Headern habe ich das allerdings noch nicht gesehen. Zitieren
TDM Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Bei Nicht-Standard-Headern habe ich das allerdings noch nicht gesehen. hmm, wieder was gelernt. Was sind eigentlich .inl ? cpp's die nur inline-Funktionen haben? Zitieren
Klotzkopp Geschrieben 21. Mai 2008 Geschrieben 21. Mai 2008 Was sind eigentlich .inl ? cpp's die nur inline-Funktionen haben? Du kannst als Dateiendung benutzen, was du willst, das ist nirgends festgelegt. Üblicherweise verwendet man .inl für Dateien, die Definitionen enthalten, welche mehrfach vorhanden sein dürfen (oder sogar müssen), wie z.B. Definitionen von inline-Funktionen oder Templates. Diese Dateien werden nicht selbst als Übersetzungseinheit verarbeitet, sondern über Includedirektiven in anderen ÜE eingebunden. Da sie aber Definitionen enthalten, sind sie keine typischen Headerdateien. Daher der andere Suffix, um sie von Headern abzugrenzen. Oft wird auch eine .inl-Datei am Ende der zugehörigen Headerdatei eingebunden. 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.