2010-09-30 13 views
7

Digamos que tenemos una clase llamada Complex que representa un número complejo. Quiero convertir este objeto en un objeto double.¿Cómo convertir un tipo definido por el usuario a un tipo primitivo?

El revés que pueda hacer mediante la implementación de una copia ctor en Complejo:
Complex(const double &d);

Sin embargo, no puedo poner en práctica copio ctor en doble, que recibirá un complejo.

¿Cómo hago esto? Sé que hay una forma de sobrecargar al operador, pero no pude encontrar cómo.
Finalmente quiero que el esta línea se compilará:
Complex c;
(double)c;

Gracias !!

Respuesta

10

Implementar un operador de conversión en su clase Complejo:

class Complex 
{ 
// ... 
    operator double() const 
    { 
    double ret = // magic happens here 
    return ret; 
    } 
}; 

Si por cualquier razón usted no quiere perder el tiempo con esto, puede proporcionar una función de conversión mundial:

double convert_to_double(const Complex& rhs) 
{ 
    double ret = // magic happens 
    return ret; 
} 
2

La forma correcta de hacer esto es la adición de un operador de conversión a su clase.

class myclass {  
public:  
    operator double() const 
    { 
     return _mydouble; 
    } 
... 
}; 

y se utiliza de esta manera:

myclass c; 
double d = c; // invokes operator double 
0

doble operador es lo que necesita

class Complex 
{ 
    operator double() const {....} 
} 
3

¿Quiere decir que quiere hacer esto

Complex c; 
double d = c; ? 

Usted puede escribir un conversion operator para ese propósito

struct Complex{ 
    double double_val; 

    operator double() const { 
     return double_val; 
    } 
}; 
0

Se puede crear un molde de encargo operador: - http://msdn.microsoft.com/en-us/library/ts48df3y%28v=VS.100%29.aspx - operador-Sobrecarga/doublecastoperator.htm "> http: //www.j ava2s.com/Tutorial/Cpp/0200_Operator-Overloading/doublecastoperator.htm

lo que el código sería algo como esto (dentro de su clase Complex): operador doble() {return/* lo que quiere hacer a la complejo * /}

2

El problema con una clase Complex es que los números complejos son un superconjunto de números reales, es decir, aunque todos los números reales también son números complejos, no todos los números complejos son números reales.

Por lo tanto, mientras que, como otros señalaron, necesita definir un operador de tipo de letra en Complex para double, el trabajo real es lo que pone en esa función. Lo más seguro sería la de lanzar una excepción si el número no es real:

#include <exception> 

struct Complex 
{ 
    double real; 
    double imag; 

    Complex(double real_, double imag_ = 0.0): real(real_), imag(imag_) {) 

    // ... 

    class not_real: public exception 
    { 
     virtual const char* what() const throw() 
     { 
      return "cannot cast non-real complex number to double"; 
     } 
    }; 

    operator double() const { 
     if(imag != 0.0) 
      throw not_real(); 
     return real; 
    } 
}; 
Cuestiones relacionadas