2010-07-17 5 views
9

Les fonctions d'ami devraient pouvoir accéder à un membre privé de classe droit? Alors qu'est-ce que j'ai fait de mal ici? J'ai inclus mon fichier .h avec l'opérateur < < J'ai l'intention de devenir ami avec la classe.ami avec la classe mais ne peut pas accéder aux membres privés

#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; 
} 

Répondre

12

ici ...

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

    return out; 
} 

vous avez besoin

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

    return out; 
} 

(j'ai été mordu sur les fesses par ce à plusieurs reprises, la définition de votre surcharge de l'opérateur n » t correspond tout à fait à la déclaration, donc on pense qu'il s'agit d'une fonction différente.)

+2

il est drôle comment le plus simpliest chose est le plus difficile à trouver ... – starcorn

+0

Est-ce que 'fun &' toujours doivent être 'const'? – peter

5

Les signatures ne correspondent pas. Votre fonction non-membre prend plaisir & amusant, l'ami a déclaré sur prend plaisir & amusant.

0

Vous pouvez éviter ce genre d'erreurs en écrivant la définition de fonction ami dans la définition de la classe:

class fun 
{ 
    //... 

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

L'inconvénient est que chaque appel à operator<< est inline, ce qui pourrait conduire à météorisation code.

(Notez également que le paramètre ne peut pas être appelé fun parce que ce nom indique déjà un type.)

Questions connexes