Code funzt net!
-
randa schrieb:
1)Inlcude nochmal checken
2)libs gelinkt?
3)undefinierte funktion?
4)extern vergessen?Bevor du Code oder Fehler postest, check das nochmal nach.
- Siehe vorheriger post (hab ich net erst 1 mal gemacht)
- Hab ich net, oder (Was genau is dat?)
- Ne
- Was'n dat?
Das Letzte) Zu spät!
-
print sollte was returnen, schließlich hast du es als int-rückabe deklariert.
int rational.h solltest du einen include guard hinmachen.PS: Mir scheint, als ob du Ulrich Breymanns C++ - Eine Einführung benutzt, sehe ich das richtig?
Edit: und deine klasse ist zweimal definiert.
-
@Interpreter: Deklarier ich se net in der header und definier se in der cpp? Sonst gehts jedenfalls net (Bei der syntaxüberprüfung)! (Siehe auch den Thread Klasse über header prototyp deklarieren)
@randa: Ich weiß, die Leute legen viel wert auf guten stil, aber ich glaub dev-cpp macht das selber. Ich machs trotzdem mal... was is ein include guard? Heißt der nicht Volkard Henkel?
-
ein include guard ist:
#ifndef RATIONAL_H_INCLUDED #define RATIONAL_H_INCLUDED //Klasse... #endif
anstatt Rational_h_included kannst du auch was anderes nehmen, es muss aber gleich sein.
Das bewirkt, das der compiler die Datei nur einmal in eine andere Datei einbindet und somit keine multiple definition gemeckert wird. wenn du mehrere header in einrer cpp hast, von denen mehrere rational.h einbinden, dann brauchst du das.
-
OK, nun hab ich auch einen include guard...
Das hilft mir aber alles net weiter! Immer noch das selbe Problem...
Wenn ihr alle feststellt das ich die Klasse 2 mal definiere, könnte mir bitte jemand sagen welches stück code ich löschen muss? Wie gesagt, meiner Meinung nach geht aus dem anderen Thread hervor das ich die Klasse einmal definiere (cpp) und einmal deklariere...
-
definiere deine Klasse in der headerdatei, so wie bisher.
in der cpp datei schreibst du:Rückgabewert Klasse::Methode (Parameterliste) { Implementation }
Die Namen sind selbstredend. Du implmenetierst die Funktionen (Methoden) ganz normal, nur mit dem Bereichsoperator :: um klar zu machen, das diese Methode der entsprechenden Klasse angehört.
-
Eine Klasse zu deklarieren wäre sowas:
class Foo;
Du *definierst* die Klasse aber zweimal, einmal im Header und einmal in der .cpp.
Im Header ist es richtig. In der .cpp definierst du nur noch die Methoden, die du im Header in der Klassendefinition deklariert hast.Übernimm es jetzt einfach so und denk dann erst drüber nach.
Header:
class Foo
{
void method();
};.cpp:
void Foo::method()
{
// code
}
-
Ah, jetzt wirds tag...
Also muss ich:int Rational::kuerzen() { int ggtVar=ggt(m_zaehler,m_nenner); m_zaehler/=ggtVar; m_nenner/=ggtVar; };
statt:
int kuerzen() { int ggtVar=ggt(m_zaehler,m_nenner); m_zaehler/=ggtVar; m_nenner/=ggtVar; };
schreiben, oder so? Dann bekomm ich die Fehlermeldung:
1 C:\DOKUME1\TOM\EIGENE1\C__~1\Projekte\Rational\Rational.cpp syntax error before `::' tokenAchja, und wie muss das beim Konstruktor sein? So?
Rational Rational::(int zaehler,int nenner){ m_zaehler=zaehler; m_nenner=nenner; kuerzen(); };
-
du musst in die cpp datei auch den header einbinden.
Beim Konstruktor schreibst du Rational::Rastional () oder Rational::Rational (int zaehler, int nenner).
Da der Konstruktor nix zurückgibt, fällt das halt einfach weg.
-
Jetzt klappt fast alles! Nur noch ein paar Fehler nach dem stil:
main.cpp C:\DOKUME1\TOM\EIGENE1\C__~1\Projekte\Rational\codes\main.o(.text+0x0) multiple definition of `ggt(int, int)'
Was 'n das? Ich weiß net wo ich ggt 2 mal definiert hab? Nur 1 mal in mymath.h...int ggt(int a,int b) { // a soll größer als b sein a=abs(a); b=abs(b); // Immer positive Werte nehmen if(b>a) return ggt(b,a); if(b!=0) return ggt(b,a%b); else return a; }; int kgv(int a,int b) { return a*b/ggt(a,b); };