为double类型重载operator=运算符

4

你能否重载双精度浮点数类型的 = 运算符?

我有以下代码:

double operator=(double a, Length b) {
    return a = (b.getInches()/12+b.getFeet())*3.2808*0.9144;
}

它抛出以下错误:
'double operator=(double, Length)' must be a nonstatic member function

我做错了什么?

可能你希望Length可以转换为double,以支持像Length a; double b; b = a;这样的表达式。可转换意味着Length具有operator double - leemes
2
可能是重复的问题:重载 = 运算符时出错(必须是非静态成员函数) - Engineer2021
你真的想要重载赋值运算符吗?也许你想要重载从 Lengthdouble 的转换,如果是这样,你应该重载 Length::operator double()... - Massa
2个回答

8

您无法为基本类型重载赋值操作符,但是您可以提供一个将Length转换为double的运算符,从而实现您想要的效果:

class Length {
    ...
public:
    operator double() {
        return (getInches()/12+getFeet())*3.2808*0.9144;
    }
};

main() {
    Length len = ...;
    ...
    double d = len;
}

请注意,仅当读者完全清楚转换的内容时才应进行此转换。例如,在此情况下,您应该创建一个get_yard成员函数,如下所示:
class Length {
    ...
public:
    double get_yards() {
        return (getInches()+12*getFeet())/ 36.0;
    }
};

请注意,您无需将英尺转换为米,再转换为码 - 您可以直接从英尺转换为码;转换系数为3.0。您也可以最后进行除法运算 - 参见上面修改后的表达式。

1
提及这种方法的潜在缺点可能是有益的,即歧义和各种解决方法。 - Mooing Duck
@staticx 我同意,只有当转换对读者来说非常清晰明了时才应该这样做。如果不是这样,就应该使用成员函数。我编辑了答案以提到这一点。谢谢! - Sergey Kalinichenko
@Roddy :):):) 你说得对 - 我把12除以3了,而不是乘以3(这是在一个只教公制的国家长大的结果)。虽然我应该检查一下我的数学,谢谢! - Sergey Kalinichenko

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接