Masquer l’implémentation avec PIMPL
Masquer les détails d’implémentation derrière l’idiome du pointeur vers l’implémentation
Masquer l’implémentation avec PIMPL est une leçon C++ Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C++ Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C++ Academy comprend 4 leçons au total.
L'idiome PIMPL
PIMPL = « Pointeur vers l'IMPLémentation ». Déplacez les données privées de la classe dans une structure Impl distincte, accessible via un pointeur.
Pourquoi utiliser PIMPL ?
Avantages :
- Masquer les détails de l'implémentation dans les en-têtes
- Réduire les dépendances à la compilation
- Préserver la stabilité de l'ABI lors de l'ajout de membres privés
- Permettre de remplacer les implémentations
Structure de base
La classe publique contient un pointeur vers une structure Impl définie uniquement dans le fichier .cpp.
// widget.h
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
struct Impl;
std::unique_ptr<Impl> pimpl_;
};Impl dans le .cpp
La structure Impl contient toutes les données réelles.
// widget.cpp
struct Widget::Impl {
std::string name;
int counter;
// ... anything else, freely
};
Widget::Widget()
: pimpl_(std::make_unique<Impl>()) {}
Widget::~Widget() = default; // must be in .cpp where Impl is complete
void Widget::doSomething() {
pimpl_->counter++;
}Destructeur dans le .cpp
Le destructeur doit être défini dans le .cpp où Impl est complet. Sinon, unique_ptr ne peut pas supprimer un type incomplet.
Fonctions membres spéciales
La copie, le déplacement et l'affectation doivent également être déclarés explicitement si nécessaire. Les versions générées par le compilateur ne peuvent pas fonctionner avec un type incomplet dans l'en-tête.
// widget.h
class Widget {
public:
Widget(const Widget& other);
Widget& operator=(const Widget& other);
Widget(Widget&&) noexcept;
Widget& operator=(Widget&&) noexcept;
~Widget();
};Coût en performances
PIMPL ajoute une indirection à chaque accès à un membre et une allocation sur le tas. Cela peut compter pour les méthodes fréquemment appelées : mesurez pour en avoir la certitude.
Compilations plus rapides
Les en-têtes qui incluaient auparavant des types standard ou des dépendances coûteuses peuvent désormais rester légers. Modifiez le .cpp sans recompiler les utilisateurs.
PIMPL avec héritage
Il est possible de le combiner avec l'héritage, mais cela ajoute de la complexité. La classe publique n'hérite généralement de rien ; Impl peut utiliser l'héritage librement.
Variantes
Alternatives et améliorations :
- Fast PIMPL — stockage en ligne avec un new de placement
- Adresse stable — Impl reste alloué pendant toute la durée de vie de l'objet
- Effacement de type — Impl peut être polymorphe
Utilisation concrète
PIMPL est largement utilisé par :
- Qt (chaque Widget utilise PIMPL)
- De nombreuses bibliothèques propriétaires
- Boost, à certains endroits
Quand l'utiliser
Utilisez PIMPL lorsque :
- Vous voulez une stabilité de l'ABI entre les versions
- Vos en-têtes incluent trop de dépendances de manière transitive
- Vous exposez l'API publique d'une bibliothèque
Quand l'éviter
Évitez PIMPL lorsque :
- La classe est interne : aucun utilisateur ne dépend de l'en-tête
- La surcharge de performances importe davantage que les temps de compilation
- La classe est petite ou rarement modifiée
Vérification rapide
Pourquoi le destructeur d'une classe PIMPL doit-il être défini dans le fichier .cpp ?
Récapitulatif
PIMPL masque l'implémentation en déplaçant les données privées dans une structure Impl accessible via unique_ptr. Il améliore la stabilité de l'ABI et les temps de compilation, au prix d'une indirection. Définissez les fonctions membres spéciales dans le .cpp où Impl est complet.
Questions Fréquemment Posées
La leçon « Masquer l’implémentation avec PIMPL » est-elle gratuite ?
Oui — le texte complet de « Masquer l’implémentation avec PIMPL » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C++ Academy, passe à CoddyKit PRO. Le cours C++ Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Masquer l’implémentation avec PIMPL » ?
Masquer les détails d’implémentation derrière l’idiome du pointeur vers l’implémentation Tu pratiques C++ Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C++ Academy ?
Aucune expérience préalable n'est requise. C++ Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Masquer l’implémentation avec PIMPL » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C++ Academy ?
Oui. Chaque leçon C++ Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Bibliothèques à en-tête uniquement ou compilées
- Gestion des versions d’API et stabilité de l’ABI
- Masquer l’implémentation avec PIMPL
- Écrire une bibliothèque utilitaire moderne à en-tête unique