2010-07-17 30 views
9

Las funciones de amigo deberían poder acceder a miembros privados de una clase ¿no? Entonces, ¿qué he hecho mal aquí? He incluido mi archivo .h con el operador < < Tengo la intención de ser amigo de la clase.amigo con clase pero no puede acceder a miembros privados

#include <iostream> 

using namespace std; 
class fun 
{ 
private: 
    int a; 
    int b; 
    int c; 


public: 
    fun(int a, int b); 
    void my_swap(); 
    int a_func(); 
    void print(); 

    friend ostream& operator<<(ostream& out, const fun& fun); 
}; 

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

Respuesta

12

aquí ... En

ostream& operator<<(ostream& out, fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

necesita

ostream& operator<<(ostream& out, const fun& fun) 
{ 
    out << "a= " << fun.a << ", b= " << fun.b << std::endl; 

    return out; 
} 

(que ha sido mordido en el culo por esto muchas veces, la definición de su operador de sobrecarga doesn' t coincidir exactamente con la declaración, por lo que se cree que es una función diferente.)

+2

Es curioso como la cosa más más simple es el más difícil de encontrar ... – starcorn

+0

¿El 'diversión y' siempre tienen que ser 'const'? – peter

5

Las firmas no coinciden. Su función de no miembro se divierte & diversión, el amigo declaró en toma const diversión & diversión.

0

Puede evitar este tipo de errores al escribir la definición de función amigo dentro de la definición de clase:

class fun 
{ 
    //... 

    friend ostream& operator<<(ostream& out, const fun& f) 
    { 
     out << "a= " << f.a << ", b= " << f.b << std::endl; 
     return out; 
    } 
}; 

La desventaja es que cada llamada a operator<< se colocarán en línea, lo que podría conducir a la hinchazón de código.

(También tenga en cuenta que el parámetro no se puede llamar fun porque ese nombre ya indica un tipo.)

Cuestiones relacionadas