2010-09-30 40 views
7

Giả sử chúng ta có một lớp được gọi là Complex đại diện cho một số phức. Tôi muốn chuyển đối tượng này thành đối tượng double.Làm cách nào để chuyển đổi loại người dùng đã xác định thành loại nguyên thủy?

Một cách khác xung quanh tôi có thể làm bằng cách thực hiện một bản sao trong ctor Complex:
Complex(const double &d);

Tuy nhiên, tôi không thể thực hiện i sao chép ctor trong đôi đó sẽ nhận được một Complex.

Làm cách nào để thực hiện việc này? Tôi biết có một cách với quá tải nhà điều hành, nhưng tôi không thể tìm thấy như thế nào.
Cuối cùng tôi muốn dòng này sẽ biên dịch:
Complex c;
(double)c;

Cảm ơn !!

Trả lời

10

Thực hiện một nhà điều hành chuyển đổi trên lớp Complex của bạn:

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

Nếu vì bất cứ lý do bạn không muốn muck về với điều này, bạn có thể cung cấp chức năng chuyển đổi toàn cầu:

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

Cách thích hợp để thực hiện việc này là thêm toán tử chuyển đổi vào lớp học của bạn.

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

và sử dụng như thế này:

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

điều hành kép là những gì bạn cần

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

Bạn có nghĩa là bạn muốn làm điều này

Complex c; 
double d = c; ? 

Bạn có thể viết một conversion operator cho mục đích đó

struct Complex{ 
    double double_val; 

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

Bạn có thể tạo một dàn diễn viên tùy chỉnh toán tử: - http://msdn.microsoft.com/en-us/library/ts48df3y%28v=VS.100%29.aspx - Toán tử quá tải/doublecastoperator.htm "> http: //www.j ava2s.com/Tutorial/Cpp/0200_Operator-Overloading/doublecastoperator.htm

Vì vậy, mã của bạn sẽ trông giống như thế này (trong lớp Complex): toán tử double() {return/* bất cứ điều gì bạn muốn làm với phức tạp * /}

2

Lớp chà với lớp Complex là số phức là một số siêu thực, tức là khi tất cả số thực cũng là số phức, không phải tất cả các số phức đều là số thực.

Vì vậy, trong khi những người khác chỉ ra, bạn cần phải xác định toán tử định kiểu trong Complex cho double, công việc thực tế là những gì bạn đưa vào hàm đó. Điều an toàn nhất là ném một ngoại lệ nếu số không thực tế:

#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; 
    } 
}; 
Các vấn đề liên quan