C++ rechnen mit rationalen Zahlen
-
Toll. Wieso schreibst du nicht endlich die Fehlermeldung?

-
Das Problem besteht unter anderem darin, dass der Compiler in ratio.cpp meint, dass zaehler, nenner und teiler nich deklariert wurde. Aber das habe ich doch in der header-datei gemacht, oder?
Und dann meint der Compiler das er am anfang von ratio.cpp nicht von rational auf long springen kann.ich habe oben doch beschrieben....
-
Hab ich doch, oder? Dritter Beitrag. Naja etwas genauer:
In member function
void rational::add(rational, rational)': cannot convert \rational' to `long int' in assignmentIn function `long int ggt(long int, long int)': `zaehler' undeclared (first use this function)
`nenner' undeclared (first use this function)
`teiler' undeclared (first use this function)
und mir ist noch aufgefallen:
[Build Error] [ratio.o] Error 1Hoffe das ist ok.
-
expert schrieb:
Naja etwas genauer:
Was den Unterschied zwischen unbrauchbar und nützlich ausmacht. Interpretieren ist für Gedichte da, der Computer möchte es etwas präziser haben.
In member function
void rational::add(rational, rational)': cannot convert \rational' to `long int' in assignmentSchreibfehler: Komma statt Punkt geschrieben.
-
Nein, wie blöd... danke wegen des Punkts^^.
-
Hat denn einer ne Idee woher die anderen Probleme kommen könnten, oder besser wie sie beseitigt werden können?
-
Ja. Aber warum versuchst du nicht wenigstens, aus den Fehlermeldungen schlau zu werden? Genauer als "... undeclared" kann man nicht deklarierte Variablen ja wirklich nicht mehr beschreiben.
-
ggt ist bei dir keine Memberfunktion von rational und kennt daher auch nicht dessen Membervariablen.
-
Vielen Danke, Leute!
Habt mir sehr geholfen!MfG
expert
-
Hallo,
bin auf ein neues Problem gestossen.
Und zwar soll ich die den Additionsoperator und natürlich die anderen arithmetischen Operatoren (von denen hab ich den Code nicht gepostet) überladen.
Kann mir jemand von euch anhand des Additionsoperators zeigen, wie das gehen könnte und wie ich das entsprechend einbaue.Habe schon folgenden Ansatz:
rational operator+(rational a, rational b) { rational t; t.zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner; t.nenner = a.nenner*b.nenner; t.kuerzen(); return t; } rational operator+(rational a, rational b) { return b+a; }Jedoch komm ich da nicht weiter.
-
Was soll der zweite operator bezwecken und was soll "ich komme nicht weiter" heißen? Ist es so schwer eine Frage vernünftig zu stellen?
-
Was heißt nicht weiterkommen? So wie ich das sehe bist du schon fertig:
rational operator+(rational a, rational b) { rational t; t.zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner; t.nenner = a.nenner*b.nenner; t.kuerzen(); return t; }(Wobei man noch erwähnen sollte, dass man den + Operator meistens vom += Operator ableitet, aber das ist eine andere Geschichte)
-
Wie genau bekomme ich das denn nun angewendet? Mein Zaehler und mein Nenner sind ja privat. Und wenn das gelöst is reicht es dann, wenn ich einfach wieder mein Testprogramm benutze?
ratio.h: In function `rational operator+(rational, rational)':
ratio.h:30: error:
long int rational::zaehler' is private ratio.cpp:92: error: within this context ratio.h:30: error:long int rational::zaehler' is private
ratio.cpp:92: error: within this context
ratio.h:30: error:long int rational::nenner' is private ratio.cpp:92: error: within this context ratio.h:30: error:long int rational::zaehler' is private
ratio.cpp:92: error: within this context
ratio.h:30: error:long int rational::nenner' is private ratio.cpp:92: error: within this context ratio.h:30: error:long int rational::nenner' is private
ratio.cpp:93: error: within this context
ratio.h:30: error:long int rational::nenner' is private ratio.cpp:93: error: within this context ratio.h:30: error:long int rational::nenner' is private
ratio.cpp:93: error: within this context
-
Mach den Operator zum friend!
-
Achso... ich dachte ich bräuchte das nur, wenn ich keinen Typumwandlungskonstruktor habe.
Müsste dann so aussehen:friend rational operator+(long, rational); friend rational operator+(rational, long);,oder?
Das setz ich dann direkt über die rational operator?
-
expert schrieb:
Achso... ich dachte ich bräuchte das nur, wenn ich keinen Typumwandlungskonstruktor habe.
Müsste dann so aussehen:friend rational operator+(long, rational); friend rational operator+(rational, long);,oder?
Der Operator in deinem Beispiel hat aber die Singatur
rational operator+(rational, rational);Das setz ich dann direkt über die rational operator?
Nein, friend Deklarationen gehören in die Klasse.
-
Vielen Dank für deine Hilfe Sepp!
Steh aber irgendwie auf dem Schlauch. Ich brauch doch das noch hier:rational operator+(rational a, rational b) { return b+a; },oder?
Und wie kann ich das schließlich angezeigt bekommen? Hab das sonst bei der Addition, z.B. mit erg.add(a,b);
gemacht.
-
Nachtrag:
Und wenn ich das einbaue was ich eben gepostet habe bekomme ich vom Compiler:ratio.cpp: In function
rational operator+(rational, rational)': ratio.cpp:100: error: redefinition ofrational operator+(rational, rational)'
ratio.cpp:91: error: `rational operator+(rational, rational)' previously defined hereWie umgehe ich diese Redefinition?
-
expert schrieb:
Wie umgehe ich diese Redefinition?
Indem du die Funktion (hier deinen
operator+) nur ein einziges Mal definierst. Allerdings gibt es bezüglich Operatorüberladung einige Dinge, die du besser machen könntest (z.B.operator+=in Klasse undoperator+mit dessen Hilfe implementieren, Const-Referenz-Parameter), siehe dazu hier.Übrigens:
rational operator+(rational a, rational b) { return b+a; }wird zu einer Endlosrekursion und somit zu einem Stackoverflow führen.
-
Sry Leute wenn ich euch nerve, aber ich komme echt nicht weiter.
Habfriend rational operator+(rational, rational);in der Header Datei.
Hab mir den Link von Nexus auch angesehen, aber ich werd nich richtig raus schlau...
Muss dazu sagen, dass ich in C++ noch wenig bis keine Erfahrung habe. Könnte mir vielleicht einer das Beispiel für die Addition geben?
Kann man das denn nicht zusammenfügen? Und dann a und b über cout ausgeben?rational operator+(rational a, rational b) { rational t; t.zaehler = a.zaehler*b.nenner + b.zaehler*a.nenner; t.nenner = a.nenner*b.nenner; t.kuerzen(); return t; } rational operator+(rational a, rational b) { return b+a; }