如何为自定义Coordinates类型实现点积运算符?
如何为自定义
Coordinates类型实现点积操作? 首先得明确:C++完全不允许你自定义像*+这种全新的运算符组合,也没法通过字面量运算符来实现这种多参数操作——字面量运算符本来就只能处理单个参数(比如把数字字面量转换成自定义类型),所以你之前的几次尝试报错都是情理之中的。
针对你的点积需求,这里有几个靠谱的替代方案:
方案1:编写dot()自由函数(最推荐)
这是最符合C++编程惯例的方式,完全不会和你已有的逐元素operator+、operator*冲突,代码可读性拉满:
double dot(const Coordinates& lhs, const Coordinates& rhs) { return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2]; }
使用时直接写dot(C1, C2),任何人看到都能立刻明白这是在计算点积,完全没有歧义。
方案2:重载已有运算符(谨慎使用)
如果你执着于用运算符语法,C++允许重载已有的运算符,但要避开你已经在用的(比如你已经把operator*用来做逐元素乘法,就不能再重载它返回double,会导致二义性)。可以选一些不常用的运算符,比如operator%或者operator^来代表点积:
double operator%(const Coordinates& lhs, const Coordinates& rhs) { return lhs[0] * rhs[0] + lhs[1] * rhs[1] + lhs[2] * rhs[2]; }
这样就能用C1 % C2得到点积结果,但这种方式需要团队内部提前约定好含义,不然其他开发者看到可能会困惑,所以优先级低于dot()函数。
方案3:转为类成员函数(若后续调整类型定义)
如果你之后打算把Coordinates从std::array的别名改成自定义类,也可以把点积实现成成员函数:
class Coordinates { private: std::array<double, 3> data; public: // 补充构造函数、已有的+、*重载等 double dot(const Coordinates& other) const { return data[0] * other.data[0] + data[1] * other.data[1] + data[2] * other.data[2]; } };
使用时就是C1.dot(C2),同样清晰易懂。
总结一下:自定义*+这类新运算符在C++里是行不通的,最稳妥、最易维护的方案就是编写dot()自由函数。
内容的提问来源于stack exchange,提问作者Hadi Farah
相关产品推荐
相关产品推荐

