C 将操作员作为类成员超载
C++ Overloading an Operator as a Class Member
我在遇到问题时试图创建一个简单的向量类。这是我的代码的片段:
class Vector2D{
protected:
int x, y;
public:
Vector2D operator - (const Vector2D&);
friend int SumDiff(const Vector2D& obj1, const Vector2D& obj2);
};
Vector2D Vector2D::operator - (const Vector2D& param)
{
Vector2D obj;
obj.x = x - param.x;
obj.y = y - param.y;
return obj;
}
int SumDiff(const Vector2D& obj1, const Vector2D& obj2)
{
int result;
Vector2D obj3;
obj3 = obj1 - obj2;
result = obj3.x + obj3.y;
return result;
}
线obj3 = obj1 - obj2;
被突出显示为错误。具体而言,此行中的操作员-
似乎并未将Vector2D
对象作为操作数。
即使SumDiff
功能是Vector2D
类的一部分,也会发生相同的问题。
此代码似乎仅在运算符-
作为非成员函数重载时进行编译。为什么?
预先感谢。
必须将操作员声明为const:
Vector2D operator - (const Vector2D&) const;
其他,您不能将其与obj2
一起使用,即const
。
正如Nathanolivier所说的那样,您还可以在班级外声明此操作员为:
Vector2D operator - (const Vector2D& left, const Vector2D& right)
{
Vector2D obj;
obj.x = left.x - right.x;
obj.y = left.y - right.y;
return obj;
}
然后,您需要使其成为类的朋友(或添加setter/getters),以便可以访问x
和y
。
您的operator -
成员函数未标记为const
,这意味着:
- 指出它可以修改
*this
(左手Opearnd)的状态 - 因此,不能用
const
合格对象作为左手操作数
来调用
由于 operator -
肯定应该不是修改其两个操作数,只需将其标记为const
:
Vector2D operator - (const Vector2D&) const;
请注意,通常最好将二进制运算符作为非会员实施。原因是隐式转换中的对称性。实现为成员的二进制运算符可以在其右侧操作数上使用隐式转换,但不能在左侧的一号上使用它们(因为操作数将需要适当的类型才能首先找到操作员)。<<<<<<<<<<<<<<
由于您通常还希望复合分配运算符存在,因此一种常见模式是根据复合分配实现非成员二进制运算符,例如:
Vector2D& Vector2D::operator -= (const Vector2D &rhs)
{
x -= rhs.x;
y -= rhs.y;
return *this;
}
Vector2D operator - (Vector2D lhs, const Vector2D &rhs)
{
lhs -= rhs;
return lhs;
}
最后,要在生产中使用,请考虑使用boost。操作员为您进行大部分自动委托。
相关文章:
- 超载类成员功能标记为const
- 如果类仅通过要求启用单个成员函数,仍然可以模棱两可地超载
- 找不到超载的成员功能,类位于标题中
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- 模板成员超载的Sfinae
- 是否可以将成员超载存储在容器中
- 覆盖复制/移动分配超载时,我是否需要删除当前的成员数据
- 朋友超载的派生类和基本成员访问的运营商
- C 获得超载成员功能指针的通用方法
- 如果功能超载,则BOOST PHOENIX成员功能操作员无法编译
- 成员是私人,运营商在C 中超载
- C 垃圾成员值时使用公共和私人超载构造函数
- C 将操作员作为类成员超载
- 如何从类的实例中超载成员函数
- 铸造助手用于超载成员功能指针
- 成员初始化超载构造函数
- 从模板类中的Bool值超载成员
- 基于不同枚举值的类成员超载(或专业)
- 为什么在C 中不能超载类的静态成员
- 模板检查是否存在超载成员功能