C++中Vector类重载+=运算符后报二元表达式操作数无效的原因
问题根因
你为Vector2D类重载的+=运算符作用于类的实例对象,但你代码里的m_pVelocity、m_pAcceleration、m_pPosition都是Vector2D*指针类型。C++中指针的算术运算属于内置的内存地址偏移逻辑,不会触发自定义的类运算符重载,编译器找不到匹配Vector2D* += Vector2D*的操作实现,因此抛出非法操作数错误。
另外你原有代码中的m_pVelocity()写法也存在问题:该写法是调用Vector2D类的()运算符重载,如果你没有对应实现也会触发编译错误。
修复方案
- 方案一:保留指针类型,解引用后调用运算符
需要对指针做解引用操作获取对应的Vector2D实例,再调用+=运算符,修改后的业务代码如下:
void MovingObject::move() { (*m_pVelocity) += *m_pAcceleration; m_pVelocity->limit(m_fMax_speed); (*m_pPosition) += *m_pVelocity; m_pAcceleration->zero(); }
注意解引用运算符*优先级低于+=,因此需要用括号包裹被解引用的指针变量。
- 方案二:改用值类型成员(更推荐)
如果不需要动态管理Vector2D对象的生命周期,直接把三个成员变量的类型从Vector2D*改为Vector2D,无需额外解引用即可直接使用你原本的+=调用写法,同时还能规避空指针访问、内存泄漏等指针相关风险。
内容的提问来源于stack exchange,提问作者Cosimo Davide Viggiano
相关产品推荐
相关产品推荐

