mus*_*bob 7 c++ operator-overloading operator-keyword
我很难形成一个我想问的问题,所以让我举个例子:
假设我们正在开发一个3d系统,我们已经定义了一个矢量类Vec3.我们重载一些算术运算符以获得明显的重复.其中我们重载*运算符,以便它返回两个向量的点积.现在我们的代码看起来像这样:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
Run Code Online (Sandbox Code Playgroud)
现在说我们希望能够通过使用*运算符来扩展我们的向量,比如浮点数.这可以通过声明以下内容来完成:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
Run Code Online (Sandbox Code Playgroud)
这有两个重载,我想知道是否有办法只用一个,即我们声明这而不是上面两行:
friend Vec3 operator*(const Vec3&, const Vec3&);
Run Code Online (Sandbox Code Playgroud)
然后为Vec3 ctor添加默认值以处理来自float的转换.
最后一个例子适用于:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
Run Code Online (Sandbox Code Playgroud)
但不是为了这个:
Vec3 someVec3 = otherVec3 * 1.0;
Run Code Online (Sandbox Code Playgroud)
因为编译器不知道要使用哪两个:
friend Vec3 operator*(const float, const Vec3&); //the one we want to use
or
float operator*(const Vec3&) const; //the one for the dot product
Run Code Online (Sandbox Code Playgroud)
有什么建议?
谢谢!
在这种情况下,我最初建议不要对运算符进行重载,因为您的用户如何知道是否*代表点或交叉产品(两者都是合理的含义,取决于预期的客户端使用).我实际上建议不要支持operator*和做dot,cross以及scale成员.然后,您不必担心多次重载,并且您的用户可以清楚地知道他们正在获得什么.
但是,如果你想继续操作,那么有两个重载是没有错的.创建一个虚拟Vec3来进行缩放不仅在语义上不正确,而且会增加少量不必要的开销.
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |