Gratuit fonction par rapport au membre de la fonction
Quel est l'avantage d'avoir une fonction libre (dans l'espace de noms anonymes et ne sont accessibles que dans un seul fichier source) et l'envoi de toutes les variables comme paramètres par opposition à une classe privée fonction de membre libre de tous les paramètres et accéder aux variables membres directement? Merci!
en-tête:
Class A {
int myVariable;
void DoSomething() {
myVariable = 1;
}
};
source:
namespace {
void DoSomething2(int &a) {
a = 1;
}
}
int A::SomeFunction() {
DoSomething2(myVariable); //calling free function
DoSomething(); //calling member fucntion
}
Si vous préférez faire d'eux des membres alors que faire si j'ai un cas que j'ai d'abord appeler une fonction qui n'a pas accès à toutes les variables de membre, mais que les appels de fonction à une autre fonction qui est de l'accès à un membre. Devraient-ils être tous les deux des fonctions de membre ou libre?
- Pouvez-vous au moins d'écrire un code qui essaie de compiler?
- non, le lien est sur l'interface publique, pas sur la mise en œuvre
- permettez-moi d'insister, c'est sur l'utilisation des fonctions de membre ou pas. Permettez-moi de citer la réponse en disant: "Par le fait d'avoir des tas et des tas de méthodes qui dépendent directement de l'intérieur de la classe, le moindre changement implique un ensemble de réécriture. Il n'a pas besoin de l'être."
- vos points sont bien appréciés, mais ils se réfèrent tous à des interfaces, pas implémentations. Certains des avantages sont les mêmes bien que, moins de recompilation.
- Un autre avantage peut être qu'une classe qui est légèrement plus petite taille. Mais je comprends maintenant pourquoi vous attach moi sur la mise en œuvre.
Vous devez vous connecter pour publier un commentaire.
Un avantage d'un non-membre de la fonction dans un fichier source est similaire pour les avantages de l' Pimpl idiome: clients à l'aide de vos en-têtes de ne pas avoir à recompiler si vous changez d'application.
Bien sûr, écrit comme ça,
helper()
ne pouvez utiliser l'interface publique deWidget
, de sorte que vous gagner peu. Vous pouvez mettre unfriend
déclaration pourhelper()
à l'intérieur deWidget
mais à un certain point, vous mieux passer à un véritable Pimpl solution.voir cette question: Effective C++ Article 23 Préfèrent non-membre non-amis fonctions de fonctions de membre
et aussi C++ des Fonctions de Membre du vs Gratuit Fonctions
Vous devriez préférer les fonctions libres, dans la mesure où il favorise le couplage lâche.
Envisager de faire une fonction membre seulement si elle fonctionne sur les entrailles de votre classe, et que vous considérez que c'est vraiment lié à votre classe.
C'est un point de la livre 101 C++ normes de codage, qui déclare préférer la fonction libre et statique de la fonction de plus de fonctions membres.
Bien que cela puisse être considéré comme une opinion fondée, il permet de garder un peu de classe, et pour séparer les préoccupations.
Ce réponse unis: "la raison de cette règle est que, en utilisant des fonctions de membre vous pouvez compter trop sur le fonctionnement interne d'une classe à l'accident."
this
, et qui est implicite passé, et accessible à l'intérieur de la méthode. Une méthode a ABSOLUMENT pas de comportement différent que la gratuité des fonctions relatives à la portée de vie des variables locales et des pointeurs.Le principal avantage de la gratuité des fonctions vs fonctions de membre est qu'il permet de découpler l'interface à partir de la mise en œuvre. Par exemple,
std::sort
n'a pas besoin de savoir rien sur le conteneur sous-jacent sur lequel il fonctionne, c'est juste que c'est donné accès à un conteneur (à travers les itérateurs) qui fournissent certaines caractéristiques.Dans votre exemple, le
DoSomething2
méthode ne prend pas en faire beaucoup pour réduire le couplage depuis qu'il a encore à accès privé membre de l'avoir passé par référence. C'est presque certainement plus évident de faire de l'état de mutation dans la plaineDoSomething
méthode à la place.Lorsque vous pouvez mettre en œuvre une tâche ou d'un algorithme en termes de classe de l'interface publique alors qu'en fait un bon candidat pour réaliser une fonction libre. Scott Meyers résume un ensemble de règles raisonnable ici: http://cpptips.com/nmemfunc_encap