我有一个困难时期形成的什么,我想问问,所以让我给你举个例子问题重载语法:基本操作在C++中
说我们是一个3D系统,我们有工作定义了一个矢量类Vec3。我们重载一些算术运算符以获得明显的响应。其中,我们重载*运算符,以便它返回两个向量的点积。现在我们的代码看起来应该是这样的:
class Vec3{
private:
float x, y, z;
public:
float operator*(const Vec3&) const; //dot product
.
.
.
现在说,我们希望能够通过使用运算符*的东西,以扩展我们的矢量,说一个浮动。这可以通过声明来完成下列操作:
Vec3 operator*(const float) const;
friend Vec3 operator*(const float, const Vec3&);
这yeilds两个重载和我不知道是否有一种方法只有一个做到这一点,也就是说,我们声明,取代上述两行这样的:
friend Vec3 operator*(const Vec3&, const Vec3&);
然后添加Vec3 ctor的默认值来处理float的转换。
最后一个例子将工作:
Vec3 someVec3 = 1.0 * otherVec3; //through friend Vec3 operator*(const float, const Vec3&)
但不是这个:
Vec3 someVec3 = otherVec3 * 1.0;
,因为编译器不知道要使用的两个:
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
有什么建议吗?
谢谢!
两个重载有什么问题?正如你所指出的那样,当你试图简化它时,会产生一个相当讨厌的歧义...... – 2012-02-06 17:39:48
我会做不同的唯一的事情,就是使两个版本的标量乘以友元函数,而不是一个成员,这样代码将会与操作本身具有相同的对称性。 – 2012-02-06 17:52:42
构建一个仅仅传递一个浮点数的向量将是低效的。这将会导致运行时效率低下,但可以内联一个额外的重载函数。 – QuentinUK 2012-02-06 17:58:01