Typcast mit Objekt gleicher Klasse
-
Hallo Liste,
ich habe ein Objekt der Klasse test erzeugt und möchte nun irgendwie eine Möglichkeit haben, um diesen nach double zu konvertieren. Ich dachte da an einen
Konstruktor, bekomme es aber nicht gebacken.Gruß
Boris------------------------------------------------------------------------
Also:
int main(void){
test a;
double y;
....
y=a;
....
}class test
{
private:
double w;public:
test(void) throw () {}
test(const float &a) throw () : w(a) { }
test(const double &a) throw () : w(a) { }
test(const int a) throw () : w(a) { }
test(const long a) throw () : w(a) { }
.....
};
-
Verpasse deiner Klasse einen Konvertierungsoperator
operator double() { return w; }
-
Mit einem Ctor kannst du nur in deinen Datentyp umwandeln. Für die andere Richtung benötigst du einen double-Ctor, der einen "test" annimmt (gibt's nicht) oder einen Umwandlungsoperator:
class test { double val; public: //Ctor - Umwandlung double->test test(double v) : val(v) {} //op - Umwandlung test->double operator double() {return val;} };
-
Ok, habe ich eingebaut, nun habe ich aber das Problem, dass er teilweise meine anderen Operator nicht mehr erkennt.
Bsp.:
error: ambiguous overload for 'operator<' in 'test::In((&res))< -1.0e+0'Def.
friend inline bool operator< (const test& a, const test& b) throw();Woran liegt das?
P.S. res ist vom Typ test und In(res) berechnet einen bestimmten Wert und gibt diesen zurück (vom Typ test)
-
Das liegt daran, daß der Compiler nicht entscheiden kann, ob er test::In() in einen double umwandeln und per FPU vergleichen oder -1 in einen "test" umwandeln und an deinen op< übergeben soll. Also entweder lässt du deine Vergleichs(etc.)-Operatoren weg und verlässt dich komplett auf den double-Vergleich (wenn das deine Programmlogik zulässt) oder du verwendest keinen op double, sondern eine explizite Umwandlungsmethode ("double to_dbl() {return val;}")
-
Das ist jetzt natürlich so. Der Compiler hat keinen exakt treffenden operator< gefunden und gleich zwei zur Auswahl, deinen eigenen für zwei test sowie den eingebauten für zwei double. Hier hilft z.Bsp. ein cast eines der beiden Argument in den jeweils anderen Typ (1. Argument Test nach double oder 2. Argument double nach Test).
Dieses Problem hat man eigentlich immer bei Verwendung von Konvertierungsoperatoren. Deswegen setze ich sie selber auch nicht ein sondern erzeuge mir für diese Fälle extra Memberfunktionen wie z.Bsp.double getDouble() { return w; }
Ist zwar etwas umständlicher aufzurufen aber leichter zu finden.