En Penser en C++ par Bruce Eckel, il est un exemple donné en ce qui concerne les fonctions d'ami commedéclaration d'ami en C++
// Declaration (incomplete type specification):
struct X;
struct Y {
void f(X*);
};
struct X { // Definition
private:
int i;
public:
friend void Y::f(X*); // Struct member friend
};
void Y::f(X* x) {
x->i = 47;
}
Maintenant, il a expliqué ceci:
Notez que Y :: f (X *) prend l'adresse d'un objet X . Ceci est critique car le compilateur sait toujours comment passer une adresse qui est de taille fixe quel que soit l'objet étant passé, même s'il n'a pas d'informations complètes sur la taille du type. Si vous essayez de passer l'objet entier, cependant, le compilateur doit voir la définition de la structure entière de X, connaître la taille et comment le passer, avant qu'il ne vous permet de déclarer une fonction comme Y :: g (X).
Mais quand j'ai essayé
void f(X);
comme déclaration Y struct, il montre aucune erreur. S'il vous plaît expliquer pourquoi?
Oui, je comprends que nous ne pouvons pas utiliser un type incomplet en tant que paramètre pour la fonction, mais quand je déclare fonctionner dans la structure Y sous la forme void f (X); et dans la structure X, j'écris ami void Y :: f (X); alors il n'y a pas d'erreur. Comment cela est-il autorisé? –