2010-07-17 6 views
9

Freunde Funktionen sollten in der Lage sein, auf eine Klasse private Mitglieder richtig zugreifen? Was habe ich hier falsch gemacht? Ich habe meine .h-Datei mit dem Operator < < aufgenommen, ich beabsichtige, mich mit der Klasse anzufreunden.Freund mit Klasse, aber kann nicht auf private Mitglieder zugreifen

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

Antwort

12

In hier ...

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

    return out; 
} 

Sie benötigen

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

    return out; 
} 

(Ich habe auf den Hintern von dieser mehrfach gebissen worden, die Definition des Betreibers Überlastung doesn‘ t stimmt ziemlich gut mit der Deklaration überein, daher wird angenommen, dass es eine andere Funktion ist.)

+2

es komisch, wie die einfachste Sache die am schwersten zu finden ... – starcorn

+0

Ist 'Spaß &' immer müssen sei "const"? – peter

5

Die Signaturen stimmen nicht überein. Ihre Nicht-Mitglied-Funktion macht Spaß & Spaß, der Freund erklärte auf nimmt const Spaß & Spaß.

0

Sie können diese Art von Fehlern vermeiden, indem die Freund Funktionsdefinition innerhalb der Klassendefinition zu schreiben:

class fun 
{ 
    //... 

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

Der Nachteil ist, dass jeder Anruf zu operator<< inlined wird, der Code aufblasen führen könnte.

(Beachten Sie auch, dass der Parameter nicht fun genannt werden, da dieser Name bereits einen Typ bezeichnet.)