2010-07-06 35 views
4
#include <iostream> 

class B; 

class A{ 
int a; 
public: 
friend void B::frndA(); 
}; 

class B{ 
int b; 
public: 
void frndA(); 
}; 

void B::frndA(){ 
A obj; 
std::cout << "A.a = " << obj.a << std::endl; 
} 

int main() { 
return 0; 
} 

Lorsque j'essaie de compiler ce code, une erreur s'est produite. Quelqu'un peut-il expliquer quels sont les problèmes dans ce code?C++ Déclaration avant, problème de fonction ami

+0

Quelle erreur est survenue? – Anthony

+2

J'ai repensé la question. 'friend' n'est pas l'un des mots-clés les plus utiles. De même, 'forward-declaration' a plus de sens lorsqu'il est combiné dans un tag. Edit: Oh et 'class' ont aussi plus de sens que' function' je suppose :) –

Répondre

3

Placez la totalité de la déclaration class B ... avant class A. Vous n'avez pas encore déclaré B::frndA();.

#include <iostream> 
using namespace std; 

class B{ 
    int b; 
public: 
    void frndA(); 
}; 

class A{ 
    int a; 
public: 
    friend void B::frndA(); 
}; 



void B::frndA(){ 
    A obj; 
    //cout<<"A.a = "<<obj.a<<endl; 
} 

int main() { 
    return 0; 
} 
2

Vous devez mettre la déclaration de B avant A. Le compilateur ne sait pas à ce sujet: B::frndA(). Une déclaration avant n'est pas assez d'information pour déduire quels membres le type a.

Je recommande de mettre votre déclaration de classe A dans un fichier A.h et sa définition dans un fichier A.cpp. De même, le même pour le type B intérieur de B.h et B.cpp

En haut de chaque fichier d'en-tête mis #pragma once (ou si vous préférez inclure des gardes). Puis, à l'intérieur de votre B.h, vous pouvez simplement inclure A.h.

+1

En fait, pragma peut échouer une fois quand le même fichier tombe dans des chemins de recherche différents car il est basé sur le chemin et non sur le contenu du fichier . –

+0

pragma une fois est pris en charge par tous les principaux compilateurs. Je ne pense pas que #pragma mérite une fois le vote à la baisse. Voir ici: http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958 –

+0

En effet, c'est le cas. –

2

Le problème est que vous ne pouvez pas ami une fonction membre avant que le compilateur ait vu la déclaration.

Vous devrez réorganiser votre code pour résoudre le problème (par exemple, déplacez la définition de class B avant class A).