Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben (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 von Panke
Geschrieben (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 von Andy133
Geschrieben (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 von TDM
Geschrieben

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]

Geschrieben


int a, b, result;
result = rechnung(a, ;
[/PHP]

Das würd ich aber auch nicht machen. :rolleyes:

a und b nur zu deklarieren und nicht zu initialisieren, kann zu verheerenden Fehlern kommen.

Geschrieben

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

Geschrieben

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)

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

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

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