Überladen von Operatoren
-
Hallo Leute,
ich hoffe ihr könnt mir bei meinem KLEINEN problem weiterhelfen.
Ich versuche ( ist eine Aufgabestellung ) einen Operator zu realisieren, der mit natürlichen Zahlen auch funktioniert.
z.B.
int main ()
{
Rechner a, b, c; // a, b, c sind meine Objektec = a+b+1;
}
Sobald ich die "1" dort einbringe, bekomme ich die Fehlermeldung
"Es konnte kein Operator gefunden werden, der einen rechtseitigen Operator vom Typ double akzeptiert ( oder kein geeignete konvertierung möglich)"Ich habe einen zweiten Konstruktor, der diesen Umwandeln sollte nach meinem wissen. In diesem Konstruktor steht nix drin.
Kann jetzt sein , das dieser falsch ist und was fehlt.Rechner::Rechner( double x )
{}
Der Standard Konstruktor ist auch vorhanden:
Rechner::Rechner()
{
zahl1 = 1;
zahl2 = 2;
}Mein Operator sieht so aus:
Rechner operator + ( Rechner & a, Rechner & b )
{
//..........
}
Ich hoffe das ihr mir weiterhelfen könnt.Danke im voraus.
gruß
musterschüler
-
1 ist ein integer, kein double.
Probiere
c = a+b+1.0;oder überlade
Rechner::Rechner( int x )
-
Geht leider nicht.[cpp]
kommt immer noch die Fehlermeldung.
Hier mal der gesmate Code:
#include <iostream> #include "Rational.h" using namespace std; void main () { Rational a,b,c; a.Definiere(3,3); b.Definiere(1,3); c = a+b+1.0; } long ggt (long x, long y ) { while ( y ) { long rest = x % y; x = y; y = rest; } return x; } Rational operator + ( Rational & a, Rational & b ) { Rational temp = a; return temp += b; } #include ".\rational.h" #include <cassert> Rational::Rational(void) { zaehler = 1; nenner = 1; } Rational::Rational( long x ) { zaehler = x; nenner = 1; } Rational::~Rational(void) { } long Rational::Zaehler(void) { return zaehler; } long Rational::Nenner(void) { return nenner; } Rational& Rational::operator += (Rational & x) { zaehler = zaehler * x.nenner + nenner * x.zaehler; nenner = nenner * x.nenner; Kuerzen(); return *this; } void Rational::Kehrwert(void) { long temp = zaehler; zaehler = nenner; nenner = temp; assert(nenner != 0); } void Rational::Kuerzen(void) { int sign = 1; if ( zaehler < 0 ) { sign = -sign; zaehler = -zaehler; } if ( nenner < 0 ) { sign = -sign; nenner = -nenner; } long teiler = ggt( zaehler, nenner ); zaehler = sign * zaehler / teiler; nenner = nenner / teiler; } void Rational::Definiere(long z, long n) { zaehler = z; nenner = n; assert(nenner != 0); Kuerzen(); }Ich habe gelesen, das durch die schreibweise:
c = a+b+[b]1.0[/b];für 1.0 ein temp Objekt automatisch erzeugt wird.
Leider klappt es net.
Gruß
Musterschüler
PS: Vorab ein dank von mir.
-
Du hast nur eine Konstruktor der einen long-Wert nimmt. Damit der Compiler aber deinen Wert automatisch umwandeln kann benötigst du einen für Integers / Doubles. [Oder du schreibst + 1l]
Gruß
-
FireFlow schrieb:
Du hast nur eine Konstruktor der einen long-Wert nimmt. Damit der Compiler aber deinen Wert automatisch umwandeln kann benötigst du einen für Integers / Doubles. [Oder du schreibst + 1l]
Gruß
das ist nicht das problem. aber seine operatoren nehmen referenzen auf nicht-const... da werden nat. keine temporaries erzeugt.
-
Danke!!!