2017-12-25 1 views
-1

Ich möchte Objekt in doppelten Wert konvertieren. Es sieht folgende -> ClassA clsA(1,2,3);C++ operator = von Objekt zu Doppel

double result = clsA; 

Ich schrieb etw wie das in meinem Header-Datei:

const double operator= (const ClassA&); 

Und in CPP-Datei implementiert:

const double ClassA::operator= (const ClassA& a) { 
    /* here I made some math calculation on instance 'a' and the result is double value *\ 
    return doubleValue; 
} 

aber es wird nicht Arbeit, ich weiß nicht, ob es eine gute Idee ist, es zu machen, auch ich benutze operator =, um ein Objekt einem anderen Beispiel zuzuweisen -> objA = objB, also weiß ich nicht, ob es streiten kann Äther mit der obigen Implementierung.

Vielen Dank für Ihre Hilfe!

+0

'KlasseA :: operator = (const Klasse A &) wird verwendet, um einer "ClassA" eine (Konst-Referenz) "ClassA" zuzuordnen, der Rückgabetyp sollte "ClassA &" sein, z. 'KlasseA a, b; a = b; '. Was Sie wollen, ist ein Conversion-Operator zu verdoppeln, so etwas wie 'operator double() const;' in 'ClassA'. Siehe z.B. http://en.cppreference.com/w/cpp/language/cast_operator. – Holt

+0

@Holt Kannst du hier in Kommentar mögliche Umsetzung schreiben? Ich weiß nicht, wie ich es anfangen soll? – lory

+0

@Holt und wie man 'sagt', dass das Objekt nach '=' genommen werden soll und der Wert, der zurückgegeben wird, dem doppelten Wert zugewiesen wird = objA; ? – lory

Antwort

1

Sie wollen eine Umwandlung (oder gegossen) Operator schreiben:

// integer division/multiplication 
// computes (num_*fac_)/div_ 
struct A 
{ 
    int num_, fac_, div_; 
    A (int num, int fac, int div) : num_(num), fac_(fac), div_(div) {}; 

    // convert to double 
    operator double() const { return double(num_ * fac_)/double(div_); } 
}; 

int main() 
{ 
    A a(1, 2, 3); 
    volatile double f = a; 
    return f; 
} 

Wenn Sie den Anrufer machen eine explizite Umwandlung zu verdoppeln (zu reduzieren das Risiko eines versehentlichen implizite Abgüsse zu verdoppeln erzwingen wollen, machen der Betreiber explizit.

explicit operator double() const { return double(num_ * fac_)/double(div_); 

Um die Besetzung zu erzwingen, verwenden static_cast

double f = static_cast<double>(a); 
+0

Ok, funktioniert, aber warum, wenn ich zwei Objekte zugewiesen habe -> objA = objB, gibt es mir einen Fehler: Verwendung des überladenen Operators '*' ist zweideutig (mit Operandentypen 'ClassA' und 'int') obj3 = obj1 * 2; eingebauter Kandidat * (double, int) – lory

+0

'objA = objB' hat nichts mit Floats zu tun. Definieren Sie nichts und verwenden Sie den Standardkopiekonstruktor und -operator, den der Compiler kostenlos bereitstellt, es sei denn, Sie verfügen über von Hand verwaltete Ressourcen. –

+0

Wenn ich explizit zum Operator hinzugefügt habe, gibt es mir -> Fehler: Explizite Konversationsfunktionen sind eine C++ 11 Erweiterung – lory