C++, privée dans les fonctions vraiment besoin d'être dans le fichier d'en-tête?
J'ai toujours pensé que des fichiers d'en-tête comme une sorte de "interface" décrivant une classe, auquel cas il serait préférable de garder les champs privés et des fonctions dans le fichier cpp.
Je comprends que privés doivent être des champs dans l'en-tête de sorte que d'autres classes peuvent dire combien de mémoire une instance d'une classe de consommer, mais il m'est apparu que je m'apprêtais à écrire un privé fonction d'assistance, que cette fonction pourrait être faite statique, auquel cas il n'y a pas besoin d'être "une partie de la classe" à tout, il pourrait tout aussi bien être une fonction régulière dans la définition de la classe de .fichier cpp.
Puis, il m'est apparu que tous fonctions privées pourraient être ré-écrit pour être statique par l'acceptation de pointeurs/références à des champs de la classe au lieu d'attendre d'être défini dans la classe.
Cela permettrait d'éliminer la nécessité de déclarer les fonctions privées dans le fichier d'en-tête.
Je n'aime pas suivre les conventions alors maintenant, je veux vous demander, est-il considéré comme une convention établie en C++, que les non-static private fonctions devrait être dans le fichier d'en-tête? Qu'en est statique des fonctions ou des constantes statiques?
EDIT: je vais y mettre un peu de code pour expliquer ce que j'obtiens à:
.h fichier:
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
private:
int x;
public:
void combineWithX(int y);
};
#endif
.fichier cpp
#include "SomeClass.h"
void someHelper(int* x)
{
*x = (*x) + 1;
}
void SomeClass::combineWithX(int y)
{
someHelper(&x);
x += y;
}
Noter que someHelper(int* x)
dans le fichier cpp références privé membre de x dans l'esprit, mais pas directement, et n'a donc pas besoin d'apparaître dans l'en-tête. Je me demandais si ce genre de chose est considéré comme "mauvais style'
- Notez que les fonctions privées doivent être demande d'ami de l'intérieur de la classe, ou bien ils ne pouvaient accéder aux membres privés. Si ils n'ont pas besoin privée membres de, peut-être que ces fonctions ne devraient pas être eux-mêmes membres à tous.
- Puisque vous ne pouvez pas rouvrir une classe d'expansion une fois fermé (C++11 9.2-p2), oui, vos fonctions de membre et de membre de vars de cette catégorie doivent être accouplés dans son decl. Vous pouvez certainement faire un pimpl-mise en œuvre, si désiré.
- merci, j'ai emprunté votre lien (à l'origine je l'ai lié à une aggravation de la question)
- les fonctions privées peuvent être mis à l'intérieur d'un privé intérieur de la classe, de cette façon, ils n'ont pas à être dans l'en-tête. stackoverflow.com/a/28734794/463758
- Voir th réponses constructives, des explications pourquoi les fonctions privées (même si ils sont statiques ou non virtuelle) doivent figurer dans la déclaration de la classe: softwareengineering.stackexchange.com/a/239175/221200 softwareengineering.stackexchange.com/a/324450/221200
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord que c'est un problème que les détails de mise en œuvre doivent être exposés dans un fichier d'en-tête; elle interfère avec la séparation de l'interface et la mise en œuvre.
Déplacement privé des fonctions d'assistance pour être libre des fonctions dans le
.cpp
fichier (je suppose que c'est ce que vous entendez par "statique") ne fonctionne pas si ces fonctions ont besoin d'accéder à des variables de membre privé.Vous pouvez être intéressé à regarder le pImpl idiome (en savoir plus)
PImpl idiome est nécessaire que
Si vous ne souhaitez déplacer membre privé 'fonctions' publics, en-tête, à l'aide d'un intérieur de classe est assez. Ce n'est pas la redirection de pénalité comme PImpl idiome.
public .h fichier
dans .fichier cpp
SomeClass::Private
peut avoir un nombre quelconque de fonctions d'assistance qui a un accès complet à tous les particuliers/les amis deSomeClass
, sans avoir à déclarer un d'eux dans le fichier d'en-tête.Private
besoin d'être déclarée comme un ami pour qu'il l'accès des membres privés deSomeClass
?friend struct Private
. Je viens de vérifier si votre code compile et il fait, mais je ne comprends pas pourquoi. Normal nested class/struct ne pas obtenir toutes les autorisations spéciales de sa classe englobante.friend