我有一个c ++类来处理分数,我希望它允许转换为double,
我有类似的东西:
class fraction
{
double n,d;
public:
fraction(double _n, double _d) {n = _n; d = _d;}
//some functions
double todouble() {return n/d;}
};
fraction frac(1,2);
double dbl = frac.todouble();
工作正常,但我想重载赋值运算符,所以我可以直接使用:
double dbl = frac;
我试着添加这个:
double double::operator =(double& dbl, fraction& frac) {return dbl = frac.n / frac.d;}
导致以下编译错误:
error: ‘double fraction::operator=(double&, fraction&)’ must take exactly one argument
我做错了什么?
答案 0 :(得分:3)
您需要的是转换运算符:
operator double() const { return n / d; }
答案 1 :(得分:2)
如果您希望能够将double
分配给fraction
,则可以声明非显式构造函数:
fraction(double d = 0, double n = 1) : d(d), n(n) {}
和反向
operator double() const { return n/d; }
然后
fraction f;
f = 12.5; // Assign a double to fraction
double x = f; // Assign fraction as double to a double
答案 2 :(得分:2)
您不能将赋值运算符重载为自由函数,这意味着它必须是类成员。由于double不是类,这意味着你有 no 的方式来编写一个赋值afor double。
唯一剩下的就是为您的班级编写转换运算符:
class Fraction {
//...
public:
double toDouble() const { return n/d; }
operator double() const { return toDouble(); }
};
话虽如此,这意味着你可以在任何需要double,int,float的地方使用一个分数,因为编译器使用运算符进行隐式转换,不仅要加倍,还要转换为int和其他可能内置转换的类型从双。对于某些类来说,这可能是需要的,但它可能导致歧义和错误,因为人们经常会忽略编译器考虑的转换机会。
在C ++ 11中,有可能使运算符显式:
explicit operator double() const { return toDouble(); }
这意味着不允许隐式转换,并且复制初始化将不起作用,但直接初始化将:
double dbl = frac; //Error
double dbl{frac}; //Ok
一点旁注:您应该将转换函数设为const。