2010-01-28 94 views
55

我正在实施矢量类,我需要得到一些向量的相反。是否可以使用运算符重载定义此方法?如何在C++中重载一元减运算符?

这里就是我的意思是:

Vector2f vector1 = -vector2; 

这是我希望这个操作完成的任务:

Vector2f& oppositeVector(const Vector2f &_vector) 
{ 
x = -_vector.getX(); 
y = -_vector.getY(); 

return *this; 
} 

感谢。

+4

样式注释:不要用'_'作为变量的前缀。这种风格是为实现(编译器)保留的,你可能会有冲突。另外,读者由于'_'前缀无意识地将变量识别为实现变量。你不需要在函数内部使用'_';没有它,它们将是可读的。 – 2010-01-28 18:48:53

+4

两个下划线被保留用于实现,而不仅仅是一个。 – 2010-07-07 11:56:55

+0

我相信它是_MACRO和__identifiers。 – Puppy 2010-07-07 12:20:46

回答

96

是的,但你不带参数提供它:

class Vector { 
    ... 
    Vector operator-() { 
    // your code here 
    } 
}; 

注意,你不应该回到这个*。一元 - 运营商需要建立一个全新的矢量值,而不是改变它应用到的东西,所以你的代码可能想看看这样的事情:

class Vector { 
    ... 
    Vector operator-() const { 
     Vector v; 
     v.x = -x; 
     v.y = -y; 
     return v; 
    } 
}; 
+5

+1:唯一正确的解决方案-_- – 2010-01-28 14:52:59

+1

它是错误的:它应该是v.x = -x; v.y = -y; – sergiom 2010-01-28 14:57:26

+6

@Kornel Kisielewicz:称它为“唯一的*正确的解决方案”是误导性的。一元函数'-'也可以由一个独立的函数重载,它将密切地反映OP的'oppositeVector'的实现。 – AnT 2012-11-29 19:00:20

24

这是

Vector2f operator-(const Vector2f& in) { 
    return Vector2f(-in.x,-in.y); 
} 

可以在类内或外部。我的示例在命名空间范围内。

+0

+1上使用'.getX()'和'.getY()'来捕获您需要返回一个新的Vector2f实例,而不是对当前对象的引用。 – MikeSep 2010-01-28 14:53:05

+1

这是* binary *操作符的实现。 @anon说unary没有参数。 – 2011-01-27 16:12:15

+4

不是,它是一个一元运算符。它使用'Vector2f'作为参数,因为它是在名称空间而不是类范围中定义的。我的回答是正确的。 – 2011-01-27 18:25:41

-2

只是在寻找答案了这一点,而用C++设计高精度算术库(基于GMP)。与之前所说的相反,该一元“ - ”必须返回新值,该代码适用于我:

bigdecimal& bigdecimal::operator -() { 
    mpf_neg(this->x, this->x);//set left mpf_t var to -right 
    return *this; 
} 
+2

此代码将打破奇怪和美妙(令人沮丧)的方式。它可能工作..但你会用它吹你的脚。 – ioquatix 2017-11-09 13:11:12

+0

所以如果我做'y = -x;',我应该期望'x'的价值改变吗? – patatahooligan 2018-02-27 17:58:12

+0

由于性能方面的原因,在后期发布这个问题的C++ 11中,您可能需要一个rval运算符 - 以获得更大的向量。 – 2018-02-28 11:19:12