Privé/public exemple d'en-tête?
Quelqu'un peut-il me donner un exemple de la façon dont le public et le privé, les en-têtes de travail? J'ai fait un peu de lecture sur le net, mais je n'arrive pas à trouver beaucoup d'informations utiles avec des exemples de codes. J'ai été informé que je devrais utiliser les en-têtes de séparer les publics et privés des parties de mon code pour la création d'une bibliothèque statique. Après un peu de lecture j'ai une idée générale de la façon dont il fonctionne, mais il serait vraiment apprécier un bon exemple pour me faire. Plus précisément, ce que je n'arrive pas à comprendre, c'est comment mettre les fonctions de l'interface dans mon en-tête public, privé et des variables/fonctions de ma tête? Merci!
EDIT:
Peut-être que je ne suis pas le libellé de ma question, mais ce que je voulais dire, c'est, par exemple, j'ai myMath.h et myMath.cpp et myMath.h a:
class myMath{
public:
void initialise(double _a, double _b);
double add();
double subtract();
private:
double a;
double b;
};
Et myMath.cpp a la mise en œuvre des fonctions. Comment puis-je faire en sorte que myMath.h a seulement les trois fonctions publiques et le privé, les variables sont définies dans un autre fichier (par exemple, myMath_i.h), et ces trois fichiers sont dans une telle manière que, après j'ai créer une bibliothèque statique, uniquement myMath.h est requis par les utilisateurs. Cela signifie également myMath.h ne peut pas #include myMath_i.h. Donc quelque chose comme:
myMath.h:
class myMath{
public:
void initialise(double _a, double _b);
double add();
double subtract();
}
et myMath_i.h:
class myMath{
private:
double a;
double b;
}
Bien sûr, ce n'est pas possible parce que je serai la redéfinition de la classe myMath...
Vous devez vous connecter pour publier un commentaire.
Vous avez deux fichiers d'en-tête MyClass.h et MyClass_p.h et un fichier source: MyClass.cpp.
Permet de jeter un oeil à ce qui est à l'intérieur d'eux:
MyClass_p.h:
MyClass.h:
MyClass.cpp:
Garder vos données en MyClassPrivate et distribuer MyClass.h.
std::unique_ptr
de tenirMyClassPrivate
instance.Vous pouvez déclarer tous les interfaces et les constantes que vous souhaitez exposer à la bibliothèque de l'utilisateur dans un autre fichier d'en-tête (ou un ensemble de fichiers) et de le mettre en "inc" sous-répertoire - ces en-têtes seront "public". Vous pourrez également utiliser d'autres fichiers d'en-tête de déclarer des classes et des choses que vous ne voulez pas exposer depuis theay sont des détails de mise en œuvre - vous mettre ces fichiers dans "src" sous-répertoire ... ceux - là seront "privé".
De cette façon, l'utilisateur aura une allusion au fait qu'il a pour inclure uniquement les en-têtes publics - ceux qui sont dans "inc" et uniquement les en-têtes contiennent les trucs qu'il a vraiment besoin, alors que tous les autres en-têtes sont "privés" et hors de sa zone d'intérêt, sauf si il veut lire dans la mise en œuvre.
Lorsque vous publiez votre bibliothèque binaire statique ou dynamique de la bibliothèque - vous seulement de copier le "inc" le contenu et le résultat de la compilation - ceux-ci sont assez pour l'utilisateur, et de cette façon, il ne voit pas votre mise en œuvre de sources.
En fait, j'ai trouvé les deux à en-tête d'une source d'approche à être fragile. Si vous avez oublié de mettre à jour le "public" à la tête à la suite de changer le "privé" de l'en-tête, votre code peut compiler, puis erreur quelque part d'autre au moment de l'exécution. J'ai eu cela m'arrive à moi un peu de temps, donc je préfère écrire du code qui ne compile pas moins que tout est correct.
MyClass.cpp est mis en œuvre comme ceci:
MyClass.h est le morceau intéressant:
Si le but est de cacher les détails d'implémentation (par exemple, une bibliothèque fermée), vous devrez peut-être aller avec les deux en-tête de l'approche. Si vous ne voulez pas faire glisser dans les dépendances d'utiliser une classe, le seul en-tête de l'approche peut être une solution simple et robuste.
À l'adresse Arton à la question: Il a été un moment depuis que j'ai regardé, mais je pense que la question a à voir avec l'instanciation des objets en se basant sur l'en-tête public, puis en supposant un autre objet de taille avec l'en-tête. Au moment de l'exécution, un décalage de l'objet ne correspond pas, provoquant un mémoire smash. Il semble que erenlender la réponse de couvre ce cas, avec un public/privé de la classe paire.
Public les en-têtes sont celles requises par les utilisateurs de la bibliothèque. Privé les en-têtes sont celles qui sont nécessaires pour compiler la bibliothèque, mais qui ne sont pas nécessaires par les usagers de la bibliothèque. Effectuer le fractionnement peut être très difficile, et beaucoup de bibliothèques n'ont tout simplement pas la peine.
Je me demandais la même chose depuis que je suis passer de C à C++ comme mon principal langage de programmation. Je suppose que la meilleure façon est d'utiliser des interfaces (les classes abstraites en C++): vous publiez une interface publique et privée de la mise en œuvre suffit d'utiliser l'interface de la classe de base.