Une fonction d'assistance doit-elle aller dans l'en-tête ou dans le fichier d'implémentation?
Lors de l'écriture d'une méthode d'assistance pour une classe en C++, doit-il être déclaré comme une méthode privée dans la classe de définition dans l'en-tête (.h) le fichier? Par exemple:
/*Foo.h*/
class Foo {
public:
int bar();
private:
int helper();
};
...
/*Foo.cpp*/
...
int foo::bar() {
int something = this->helper();
}
int foo::helper() {
...
}
Ou sinon, est-il préférable de ne pas le déclarer comme un membre privé de la classe, et, au lieu de simplement faire un libre-debout fonction dans la mise en œuvre?
/*Foo.h*/
class Foo {
public:
int bar();
};
...
/*Foo.cpp*/
...
int Foo::bar() {
int something = helper();
...
}
int helper() {
...
}
source d'informationauteur Ataraxia
Vous devez vous connecter pour publier un commentaire.
Autonome de la fonction dans le fichier d'implémentation améliore l'encapsulation: il a besoin d'aucune déclaration dans l'en-tête, donc pas de recompilation du code de client lors de ses changements de signature pour quelque raison que ce soit. Pour moi, c'est une assez bonne raison pour préférer cette option chaque fois que c'est possible. (Assurez-vous de le mettre dans l'espace de noms anonymes pour éviter identificateur affrontements au moment de la liaison.)
Cependant, un
private
méthode a accès à une instance de classe et de ses parties intimes via lethis
pointeur. Si elle a besoin de ces accès, il doit s'agir d'une méthode ou d'unfriend
. Dans les deux cas, il sera visible dans la définition de la classe (fichier d'en-tête), et les méthodes sont tout simplement plus pratique que des amis.Si votre assistant fonction du sens à une méthode de l'objet, j'aurais presque toujours préfèrent en faire un membre de la fonction, donc il y a un implicite
this
pointeur, plutôt que de passer unFoo *
à la fonction d'assistance.Si la fonction d'assistance n'a pas besoin d'être une méthode de l'objet (qui est, il n'a pas besoin d'accéder aux données membres ou d'autres fonctions membre), puis en faire une fonction autonome (
static
ou dans un espace de noms anonymes, de préférence).C'est un peu subjectif, je pense.
À mon avis, cela dépend si il a quelque chose à voir avec la classe des membres et/ou si vous vous attendez à un ami classes de l'utiliser (ou les classes dérivées dans le cas de
protected
d'accès).Si la fonction ne fait pas fonctionner sur tous les membres, et personne d'autre est intéressé, vous devez le garder dans la mise en œuvre de fichier comme une fonction statique. En outre, si c'est une opération qui doit être rapide, vous pouvez profiter de l'occasion pour faire
inline
.À l'inverse, si la fonction opère sur la classe ou pouvez avoir plus utilise en découlant ou concernant les classes, en faire un membre.
Ma position est que l'en-tête contient que peu d'annonces possible tout en réalisant la conception souhaitée et les propriétés de mise en page. Si il ya une option, il va dans la source. Certains détails internes ont besoin d'accéder à de trop nombreux détails internes d'une classe pour le rendre viable à ho dans la mise en œuvre, bien que.