假设我们有一个名为Complex
的类,它代表一个复数。
我想将此对象转换为double
对象。
另一种方法我可以通过在Complex中实现复制ctor来实现:
Complex(const double &d);
但是,我无法实现i复制ctor in double,它将收到一个Complex。
我该怎么做?我知道有一种运算符重载的方法,但我找不到如何。
最终我想要这行将编译:
Complex c;
(double)c;
谢谢!
答案 0 :(得分:11)
在Complex类上实现转换运算符:
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;
}
答案 1 :(得分:3)
这样做的正确方法是在班级中添加转化运算符。
class myclass {
public:
operator double() const
{
return _mydouble;
}
...
};
并像这样使用:
myclass c;
double d = c; // invokes operator double
答案 2 :(得分:3)
你的意思是你想要这样做
Complex c;
double d = c; ?
您可以为此目的编写conversion operator
struct Complex{
double double_val;
operator double() const {
return double_val;
}
};
答案 3 :(得分:3)
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;
}
};
答案 4 :(得分:0)
operator double就是你需要的
class Complex
{
operator double() const {....}
}
答案 5 :(得分:0)
您可以创建自定义强制转换运算符: - http://msdn.microsoft.com/en-us/library/ts48df3y%28v=VS.100%29.aspx - Operator-Overloading / doublecastoperator.htm“&gt; http://www.java2s.com/Tutorial/Cpp/0200_Operator-Overloading/doublecastoperator.htm
所以你的代码看起来像这样(在你的Complex类中): operator double(){return / *无论你想对复数做什么* /}