2016-07-15 13 views
3

Nehmen wir IWie man Nichtmitgliedfunktion von einem Dateifreund mit Klasse in anderer Akte macht?

// Xh (erste Datei)

#include <iostream> 
class X{ 
    int x; 
public: 
    X(int i); 
    void print_me(); 
}; 

// X.cpp (zweite Datei)

#include "X.h" 
X::X(int i){x = i} 

void X::print_me(){std::cout<< x << endl;} 

// main.cpp (dritte Datei eine Datei haben,

)
#include "X.h" 

void swap(int lhs, int rhs){ 
    // do the swap 
} 

class Y{ 
    X x_obj; 
public: 
    friend void swap(Y& lhs, Y& rhs){ 
     swap(lhs.x_obj.x, rhs.x_obj.x); 
    } 

}; 
int main(){return 0;} 

Meine Frage ist: Wie kann ich Klasse Y in main.c machen pp ein Freund von X?

Ich dachte daran, Klasse Y in .h und .cpp-Datei zu brechen und Y.h-Datei in X.h und gehen von dort. Gibt es einen anderen Weg als das? Ich meine im aktuellen Zustand des Codes Y einen Freund von X zu machen:

Der Fehler Ich bin in aktuellem Zustand erhalten ist:

> In file included from main.cpp:1:0: X.h: In function 'void swap(Y&, 
> Y&)': X.h:3:9: error: 'int X::x' is private 
>  int x; 
>  ^main.cpp:12:24: error: within this context 
>   swap(lhs.x_obj.x, rhs.x_obj.x); 
>      ^In file included from main.cpp:1:0: X.h:3:9: error: 'int X::x' is private 
>  int x; 
>  ^main.cpp:12:37: error: within this context 
>   swap(lhs.x_obj.x, rhs.x_obj.x); 

Antwort

5

Meine Frage ist: Wie kann ich Klasse Y in main.cpp ein Freund von X?

Making Y der Freund von X wird dieses Problem nicht lösen. Sie müssen die Funktion swap() Freund der Klasse X machen, da versucht wird, auf die privaten Mitglieder von X zuzugreifen.

class Y; // forward declaration to avoid circular dependencies 
class X{ 
    friend void swap(Y& lhs, Y& rhs); 
    ... 
}; 

Hinweis sollten Sie Erklärung einschließlich zu vermeiden verwenden vorwärts Y.h in X.h, die circular dependency issue führt.

+0

Jetzt habe ich neues Problem von nicht Mitglied Funktion void tauschen (Y & Lhs, Y & RHS) Zugriff auf private Mitglied von Y, die X X_obj seit dieser Funktion versucht, auf das private Mitglied von Y zuzugreifen. – solti

+0

@solti Sie haben es erklärt als der Freund der Klasse 'Y', nicht wahr? – songyuanyao

+0

yup .. aus irgendeinem Grunde dachte ich erkläre Freund mehrmals erstellen Problem .. aber anscheinend nicht wahr .. nach Freund Leeren swap (Y platzieren & lhs, Y & rhs); in Y wie ich hatte früher es funktioniert – solti