2010-09-30 4 views
7

Предположим, у нас есть класс под названием Complex, который представляет собой комплексное число. Я хочу, чтобы преобразовать этот объект в объект double.Как преобразовать определенный пользователем тип в примитивный тип?

Другой путь я могу сделать, реализовав копию CTOR в комплексе:
Complex(const double &d);

Однако, я не могу реализовать я скопировать CTOR в два раза, который получит комплекс.

Как это сделать? Я знаю, что есть способ перегрузки оператора, но я не мог найти, как это сделать.
В конце концов, я хочу, чтобы эта линия будет компилировать:
Complex c;
(double)c;

Спасибо !!

ответ

10

Реализовать оператор преобразования на ваш комплекс класса:

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

Если по каким-либо причинам вы не хотите, чтобы слоняться с этим, вы можете обеспечить глобальную функцию преобразования:

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

Правильный способ сделать это - добавить оператор преобразования в ваш класс.

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

и использовать так:

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

оператор дважды, что вам нужно

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

Вы имеете в виду вы хотите сделать это

Complex c; 
double d = c; ? 

Вы можете написать conversion operator для этой цели

struct Complex{ 
    double double_val; 

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

Вы можете создать собственный актерский оператор: - http://msdn.microsoft.com/en-us/library/ts48df3y%28v=VS.100%29.aspx - Оператор-перегрузка/doublecastoperator.htm "> http: //www.j ava2s.com/Tutorial/Cpp/0200_Operator-Overloading/doublecastoperator.htm

Так что ваш код будет выглядеть следующим образом (в пределах вашего комплекса класса): оператор дважды() {возвращение/* все, что вы хотите сделать в сложный * /}

2

Класс с классом Complex состоит в том, что комплексные числа являются надмножеством действительных чисел, т. е. все вещественные числа также являются комплексными числами, а не все комплексные числа являются действительными числами.

Итак, как указывали другие, вам необходимо определить оператор типа в Complex для double, настоящая работа - это то, что вы вложили в эту функцию. Самым безопасным было бы исключение, если число не является реальным:

#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; 
    } 
}; 
Смежные вопросы