Pregunta

Yo sé que es una buena idea para hacer tanto de la interfaz de un no-amigo clase no miembros como sea posible, y yo sólo he dado cuenta de que para mi 3D clase vector, 'Vector3', puedo mover el + =, -. = y así sucesivamente operadores fuera de la clase, dejando sólo los constructores y el operador de asignación de copia

La pregunta es: ¿qué se debe este aspecto como operador? He visto las formas canónicas de un montón de otros operadores y he seguido su consejo, pero no he visto formas canónicas de estos operadores. Me he dado lo que yo creo que debería ser a continuación.

La segunda pregunta es: ¿cuáles son estos operadores incluso llaman? operadores de asignación aritmética?

El (relevante) código antes:

class Vector3 {
public:
    Vector3& operator+=(const Vector3& rhs);
    float x, y, z;
};

Vector3& Vector3::operator+=(const Vector3 &rhs) {
    x += rhs.x;
    y += rhs.y;
    z += rhs.z;

    return *this;
}

Lo que yo he cambiado a la medida:

class Vector3 {
public:
    float x, y, z;
};

Vector3& operator+=(Vector3& lhs, const Vector3& rhs) {
    lhs.x += rhs.x;
    lhs.y += rhs.y;
    lhs.z += rhs.z;

    return lhs;
}
¿Fue útil?

Solución

Lo que tienes se ve bien a mí.

Por cierto, cuando se llega a que el operador +, es común para poner en práctica que en términos de + =. (Crear una copia de LHS, y luego llamar LHS + = rhs y devolver el resultado)

No sabe si ya está al tanto de este truco, pero ya que usted está preocupado acerca de las formas canónicas para poner en práctica estos operadores, no puede hacer daño a mencionarla. :)

Otros consejos

Lo que tienes se ve bien.

La forma básica de pensar en esto, intuitivamente, es pensar en lo que le gustaría código para que parezca cuando se escribe. Si, en este caso, se puede escribir

Vector v, w;

v += w;
w += v;

y así sucesivamente, estás en el camino correcto.

Hay un montón de buenas reglas de oro para ayudar; ver esta entrada en el C ++ FAQ para los lotes en él.

No diría "como parte de la interfaz como sea posible". No hay mucho que ganar al hacer operator+=, etc. operator-= un no-amigo No-miembro.

Algunas personas prefieren hacer cada función posible función que no es miembro no-amigo para resistir la tentación de utilizar variables miembro privadas. Pero usted es un adulto: se puede escribir la función como un miembro del público, y no utilizar las variables miembro privadas. Yo prefiero saber que la función está ligada a la clase, y por lo que es un miembro del público hace que sea explícita.

Aparte nota:
En lo personal, me parece que a menudo es bien usar los miembros privados en lugar de descriptores de acceso públicos (lo sé - Voy a quemar en el infierno). ¡No siempre! - pero a menudo
. De hecho, no son pocos los casos en que no se podía hacer el cambio a métodos de acceso público en cuestión de minutos si decide que lo necesita. Pero reconozco que no es una idea popular y no pido a la gente a seguir esa filosofía.

Hay razones concretas para que certaint Funciones y operadores "no amigo, que no son miembros". Por ejemplo, el operador << () cuando se utiliza como el "operador de la corriente de inserción" no pueden hacerse un miembro, ya que tendría que cambiar la clase LHS (la corriente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top