2012-06-22 21 views
10

he sobrecargado el operador + como estoOperador de asignación de suma sobrecargada en C++ para dos/más de dos objetos?

class sample 
{ 
private : 
    int x; 
public : 
    sample(int x1 =0) 
    { 
    x = x1; 
    } 

    sample operator+(sample s); 
}; 

sample sample::operator+(sample s) 
{ 
    x = x + s.x; 
    return *this; 
} 

int main() 
{ 
    sample s1(10); 
    sample s2; 
    s2 = s2 + s1; 
    return 0;  
} 

Es esto correcto? Mi pregunta es: si deseo agregar dos objetos de muestra diferentes, ¿cómo voy a sobrecargar el opeartor? por ejemplo, para s = s1 + s2;

Tengo ganas de hacer s = s + s1 + s2 con la implementación existente.

+2

mira aquí! http://courses.cms.caltech.edu/cs11/material/cpp/donnie/cpp-ops.html o aquí http://www.cprogramming.com/tutorial/operator_overloading.html – trumpetlicks

+1

tenga en cuenta que 'operator +' should _not_ cambie el valor del objeto a la izquierda de '+', pero el suyo sí. Si escribió 's3 = s1 + s2', su código cambiaría' s1' para mantener también el resultado. –

+0

Además, 'main' tiene un tipo de retorno' int'. –

Respuesta

13

Usando amigo sobrecarga del operador debe hacer el truco para usted y es una forma común para definir los operadores binarios, sólo tiene que añadir:

friend sample operator+(const sample& a, const sample& b); //in class 

sample operator+(const sample& a, const sample& b) { //outside the class 
    return sample(a.x + b.x); 
} 

Si quieren que siga siendo un miembro, (que tiene desventajas en algunas raras escenarios, y no hay aspectos positivos), que tienen que hacer el operador de una función const:

sample operator+(sample s) const; //in class 

sample sample::operator+(const sample& b) const { //outside the class 
    return sample(this->x + b.x); 
} 

Cualquiera de éstos permitirá Secuencia de operadores. La razón por la cual su s = s + s1 + s2 anterior estaba fallando, es que el s + s1 se ejecutaría y devolvería un objeto temporalsample. Luego, intentaría agregar s2 a esa muestra. Sin embargo, los temporales solo pueden ser const referencias [1], y como tal, solo pueden usar las funciones de miembro const. Como su función miembro operator+ no es una función const, no puede usar esa función en el const temporal. Tenga en cuenta que para hacerlo const, tuve que reescribirlo, ya que su versión modifica el objeto en el lado izquierdo de +.

[1] con las excepciones no son particularmente relevantes aquí, a saber rvalues ​​

+0

se ve bien. ¿Es la única forma de realizar esto usando el amigo? – Raulp

+0

Lo siento, no entiendo la pregunta, ¿estás preguntando si usar la palabra clave 'friend' es la única manera de lograr el requisito? – higuaro

+0

quise decir sin usar la función de amigo puede hacerse esto. Pero creo que esta es la única manera. – Raulp

Cuestiones relacionadas