C ++ pourquoi double pointeur pour le paramètre de fonction out / return?
Je suis relativement novice en C++ et en travaillant sur un assez grand projet C++ au travail. J'ai remarqué une poignée de fonctions qui prennent des doubles pointeurs comme paramètres pour les objets que la fonction va instancier sur le tas. Exemple:
int someFunc(MyClass** retObj) {
*retObj = new MyClass();
return 0;
}
Je ne suis pas sûr de savoir pourquoi les doubles pointeurs sont toujours utilisés, dans ce projet, au lieu de juste un seul pointeur? S'agit-il surtout d'une sémantique de repère qu'il est un/paramètre de retour, ou est-il plus de raison technique que je ne suis pas voyant?
source d'informationauteur Bret Kuhns
Vous devez vous connecter pour publier un commentaire.
Le double pointeur de modèle est utilisé afin de le nouvellement allouée
MyClass
peut être transmis à l'appelant. Par exempleUn seul pointeur est insuffisant ici parce que les paramètres sont passés par valeur en C++. De sorte que la modification de l'unique pointeur ne serait visible de l'intérieur
someFunc
.Remarque: Lors de l'utilisation de C++, vous devriez envisager d'utiliser une référence dans ce scénario.
Cela vous permet de passer l'argument par référence et non par valeur. Par conséquent les résultats sont visibles à l'appelant.
La réponse courte est que les paramètres en C++ sont passés par valeur, de sorte que votre fonction reçoit une copie de ce pointeur. Une fois que vous l'écraser à l'intérieur de votre fonction, le changement est perdu.
Votre extrait souhaite cependant que le changement soit visible de l'extérieur, donc il a besoin d'un moyen de remplacer le réel pointeur vers l'objet, de sorte qu'il a d'obtenir une copie d'un pointeur vers le pointeur vers la classe, de sorte qu'il peut écraser l'intérieur pointeur et à ce qu'il soit visible de l'extérieur.
Ces deux étoiles (double flèche) est en fait un pointeur vers un pointeur". C'est une façon de contourner la restriction lorsque vous ne pouvez pas retourner deux choses à partir d'une fonction en C++ (dans votre cas, un code retour indiquant la réussite ou de l'échec, et le nouvellement allouée à un objet).
À l'aide d'un seul pointeur n'aurait tout simplement pas de travail. Considérer:
Il ya des façons de rendre ce travail autres que d'utiliser un pointeur de pointeur, les mérites relatifs de ce qui pourrait être débattue.
La manière canonique de retour d'un X est de passer un pointeur vers X. Si X est un "pointeur MyClass", la manière canonique de retour c'est de passer un pointeur de pointeur de MyClass". Vous ne pouvez pas simplement passer un pointeur vers une MyClass à la fonction, car l'appelant n'a aucune idée de ce que la valeur de ce pointeur doit être.