2010-01-28 13 views
55

Estoy implementando clases vectoriales y necesito obtener un vector opuesto. ¿Es posible definir este método utilizando la sobrecarga del operador?¿Cómo sobrecargar el operador menos unario en C++?

Esto es lo que quiero decir:

Vector2f vector1 = -vector2; 

Aquí es lo que quiero este operador para llevar a cabo:

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

return *this; 
} 

Gracias.

+4

Comentario de estilo: no prefija sus variables con '_'. Este estilo está reservado para la implementación (compilador) y es posible que tenga conflictos. Además, los lectores reconozco involuntariamente sus variables como variables de implementación debido al prefijo '_'. No necesita usar '_' funciones internas; serán legibles sin eso. –

+4

Dos guiones bajos están reservados para la implementación, no solo uno. –

+0

Creo que son _MACROs y __identificadores. – Puppy

Respuesta

96

Sí, pero no se proporciona con un parámetro:

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

Tenga en cuenta que no se debe volver * esto. El unario - operador necesita para crear un nuevo valor del vector marca, no cambia la cosa se aplica a, por lo que su código puede que desee ver algo como esto:

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

+1: la única solución correcta -_- –

+1

está mal: debe ser v.x = -x; v.y = -y; – sergiom

+6

@ Kornel Kisielewicz: Llamarlo "la * única * solución correcta" es engañoso. Unario '-' también puede ser sobrecargado por una función independiente, lo que reflejaría de cerca la implementación de OP de' oppositeVector'. – AnT

24

Es

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

puede estar dentro de la clase, o en el exterior. Mi muestra está en el alcance del espacio de nombres.

+0

+1 para capturar que necesitas devolver una nueva instancia de Vector2f, no una referencia al objeto actual. – MikeSep

+1

Esta es la implementación de un operador * binario *. Unary no tiene ningún parámetro como dijo @anon. –

+4

No, es un operador unario. Toma un parámetro 'Vector2f' como se define en el espacio de nombres, en lugar del alcance de la clase. Mi respuesta es correcta –

-2

solo esperaba la respuesta para esto, mientras diseñando una biblioteca aritmética de alta precisión en C++ (basada en GMP). Al contrario de lo que se ha dicho, ese único "-" tiene que devolver un nuevo valor, este código funciona para mí:

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

Este código se va a romper de maneras extrañas y maravillosas (y frustrantes). Podría funcionar ... pero te volarás el pie con eso. – ioquatix

+0

Entonces, si hago 'y = -x;', ¿debería esperarse que el valor de 'x' cambie? – patatahooligan

+0

Por razones de rendimiento en C++ 11, que es posterior a esta pregunta, es posible que para un operador rval, para un vector más grande. –

Cuestiones relacionadas