2012-12-21 8 views
-1

J'ai un problème avec l'amitié en C++. J'ai deux classes, A et B, où la définition de B utilise une instance de A. Je veux aussi donner une fonction membre dans l'accès B aux membres de données privées dans A, et ainsi lui accorder l'amitié. Mais maintenant, l'énigme est que pour la déclaration d'amitié dans la définition de classe A, la classe B n'est pas encore définie, donc l'IDE (VS 2010) ne sait pas quoi en faire.C++: octroi de la fonction membre de la déclaration d'amitié?

#include <iostream> 
using namespace std; 

class B; 

class A { 
    friend int B::fun(A A);//B as yet undefined here 
    int a; 
}; 

class B { 
    int b; 
public: 
    int fun(A inst); 
}; 

int B::fun(A A) 
{ 
    int N = A.a + b;//this throws up an error, since a is not accessible 
    return N; 
} 

J'ai eu un coup d'œil à Why this friend function can't access a private member of the class? mais la suggestion il d'utiliser une déclaration avant de class B; ne semble pas fonctionner. Comment puis-je résoudre ce problème directement (c'est-à-dire sans faire class B un ami de class A, ou en faisant B hérité de A ou en introduisant une fonction getA())? J'ai également regardé Granting friendship to a function from a class defined in a different header, mais mes classes sont dans un fichier .cpp (et il serait préférable de le garder ainsi), pas dans des fichiers d'en-tête séparés, et je ne veux pas accorder toute l'amitié de classe de toute façon. Pendant ce temps, C++ Forward declaration , friend function problem fournit la réponse à un problème légèrement plus simple - je ne peux pas simplement changer l'ordre des définitions. Pendant ce temps, http://msdn.microsoft.com/en-us/library/ahhw8bzz.aspx fournit un autre exemple similaire, mais l'exemple ne fonctionne pas sur mon ordinateur, alors dois-je vérifier certains indicateurs de compilation ou quelque chose?

Répondre

3

L'échanger?

class A; 

class B 
{ 
public: 
int fun(A inst); 
private: 
int b; 
}; 

class A 
{ 
friend int B::fun(A A); 
private: 
int a; 
}; 

int B::fun(A A) 
{ int N = A.a + b; 
return N; 
} 
+0

Ce ne suffit pas, il y a la dépendance circulaire – SomeWittyUsername

+0

Fonctionne bien ici ... :) – JasonD

+0

J'ai aussi essayé et cela fonctionne –

Questions connexes