Les variables privées sont un moyen de masquer la complexité et les détails d'implémentation à l'utilisateur d'une classe. C'est une fonctionnalité plutôt intéressante. Mais je ne comprends pas pourquoi en c ++ nous devons les mettre dans l’en-tête d’une classe. Je vois deux inconvénients ennuyeux à ceci:
- Il encombre l'en-tête de l'utilisateur
- Il force la recompilation de toutes les bibliothèques clientes chaque fois que les internes sont modifiés
Y a-t-il une raison conceptuelle derrière cette exigence? Est-ce seulement pour faciliter le travail du compilateur?
struct foo{};
) n'est pas autorisée, mais les déclarations forward (struct foo;
) le sont.Réponses:
C'est parce que le compilateur C ++ doit connaître la taille réelle de la classe pour pouvoir allouer la bonne quantité de mémoire lors de l'instanciation. Et la taille inclut tous les membres, même les membres privés.
Une façon d'éviter cela consiste à utiliser le langage Pimpl , expliqué par Herb Sutter dans ses séries 24 et 28 de Guru of the Week .
Mise à jour
En effet, ce (ou plus généralement, la distinction de fichier en- tête / source et
#include
s) est un obstacle majeur en C ++, héritée de C. Retour dans les joursC ++C a été créé, il n'y avait pas encore d' expérience avec un grand développement de logiciels à grande échelle, où cette commence à causer de vrais problèmes. Les concepteurs de langages plus récents ont pris en compte les leçons apprises depuis, mais C ++ est soumis à des exigences de compatibilité ascendante, ce qui rend très difficile la résolution d'un problème aussi fondamental dans le langage.la source
private
est plus moderne.La définition de la classe doit être suffisante pour que le compilateur produise une disposition identique en mémoire partout où vous avez utilisé un objet de la classe. Par exemple, étant donné quelque chose comme:
Le compilateur aura généralement
a
au décalage 0 etb
au décalage4
. Si le compilateur voyait cela simplement:Il "penserait" que
b
le décalage 0 doit être remplacé par le décalage 4. Lorsque le code utilisant cette définition est attribué àb
, le code utilisant la première définitiona
est modifié, et inversement.Le moyen habituel de minimiser les effets des modifications apportées aux parties intimes de la classe est généralement appelé idiome de pimpl (sur lequel, j'en suis sûr, Google peut fournir beaucoup d'informations).
la source
Il y a probablement plusieurs raisons. Bien que la plupart des autres classes ne puissent accéder aux membres privés, les classes d'amis peuvent toujours y accéder. Donc, au moins dans ce cas, ils peuvent être nécessaires dans l'en-tête afin que la classe friend puisse voir qu'ils existent.
La recompilation des fichiers dépendants peut dépendre de votre structure d'inclusion. L'inclusion des fichiers .h dans un fichier .cpp au lieu d'un autre en-tête peut dans certains cas empêcher de longues chaînes de recompilations.
la source