Question

Je regarde une API écrite en C ++ et je suis confus quant à ce que signifie le type de paramètre suivant:

void*& data

Cela signifie-t-il que l'utilisateur passerait dans une référence à un pointeur vide? Si c'est vrai, à quoi ça sert? Je veux dire vide * est déjà indiqué, alors pourquoi voudriez-vous jamais le rediriger à nouveau?

Était-ce utile?

La solution

Il est difficile de dire sans voir son utilisation, mais vous soulignez qu'une référence est un niveau d'indirection. Le trouveriez-vous bizarre s'il s'agissait d'un pointeur vers un pointeur? Celles-ci sont assez courantes - en fait, vous les traitez lorsque vous acceptez des arguments de ligne de commande et que vous obtenez des pointeurs aux pointeurs. Un autre exemple serait si vous fabriquiez une carte de hachage à l'aide de seaux et que vous vouliez pouvoir retourner le pointeur sur le pointeur qui a commencé le seau.

Le point est que parfois vous avez besoin de plusieurs niveaux d'indirection. Il est vrai que le mélange de pointeurs et de références peut être excentrique, mais il y a de bonnes raisons à cela. Une raison courante est la nécessité du code C ++ pour interagir avec les API C. Beaucoup d'appels système POSIX nécessitent des pointeurs vides qui sont passés et ont ensuite changé, de sorte que la fonction C ++ en question peut agir comme un wrapper autour de cela.

Autres conseils

void * signifie passer le pointeur en C ++, ce qui signifie que vous passez dans un pointeur, mais c'est en fait une copie du pointeur. Si vous avez modifié ce pointeur dans votre fonction, comme changer son adresse, il ne se reflète pas dans le pointeur dans lequel vous avez passé.

Combinant cela avec pass par référence, void *& signifie que vous passez un alias du pointeur d'origine vers cette fonction. Si vous l'avez modifié, comme changer son adresse, il se reflétera dans le pointeur d'origine.

Mais veillez à ne pas retourner la référence au vide local *. Ne faites pas quelque chose comme ça:

void*& f()
{
 int* a=new int(10);
 void* x=(void*)a;
 return x;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top