0Pricing
C++ Academy · Lektion

Implementierung mit PIMPL verbergen

Verbergen Sie Implementierungsdetails hinter dem Pointer-to-Implementation-Idiom.

Implementierung mit PIMPL verbergen ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Das PIMPL-Idiom

PIMPL steht für „Pointer to IMPLementation“. Verschieben Sie die privaten Daten der Klasse in eine separate Impl-Struktur, auf die über einen Pointer zugegriffen wird.

Warum PIMPL?

Vorteile:

  • Implementierungsdetails aus Headern verbergen
  • Kompilierzeitabhängigkeiten reduzieren
  • ABI-Stabilität beim Hinzufügen privater Member bewahren
  • Implementierungen austauschen können

Grundstruktur

Die öffentliche Klasse enthält einen Pointer auf eine Impl-Struktur, die nur in der .cpp-Datei definiert ist.

// widget.h
class Widget {
public:
    Widget();
    ~Widget();
    void doSomething();
private:
    struct Impl;
    std::unique_ptr<Impl> pimpl_;
};

Impl in der .cpp-Datei

Die Impl-Struktur enthält alle tatsächlichen Daten.

// 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++;
}

Destruktor in der .cpp-Datei

Der Destruktor muss in der .cpp-Datei definiert werden, in der Impl vollständig definiert ist. Andernfalls kann unique_ptr einen unvollständigen Typ nicht löschen.

Spezielle Memberfunktionen

Copy, Move und Zuweisung müssen bei Bedarf ebenfalls explizit deklariert werden. Die vom Compiler generierten Varianten können im Header nicht mit einem unvollständigen Typ arbeiten.

// widget.h
class Widget {
public:
    Widget(const Widget& other);
    Widget& operator=(const Widget& other);
    Widget(Widget&&) noexcept;
    Widget& operator=(Widget&&) noexcept;
    ~Widget();
};

Performance-Kosten

PIMPL fügt bei jedem Memberzugriff eine Indirektion und eine Heap-Allokation hinzu. Bei häufig aufgerufenen Methoden kann das relevant sein — messen Sie daher sicherheitshalber.

Schnellere Builds

Header, die zuvor std-Typen oder teure Abhängigkeiten eingebunden haben, können nun schlank bleiben. Änderungen an der .cpp-Datei erfordern keine Neukompilierung der Consumer.

PIMPL mit Vererbung

PIMPL kann mit Vererbung kombiniert werden, erhöht aber die Komplexität. Die öffentliche Klasse erbt typischerweise von nichts; die Impl-Struktur kann Vererbung frei verwenden.

Varianten

Alternativen und Weiterentwicklungen:

  • Fast PIMPL — Inline-Speicher mit placement new
  • Stabile Adresse — Impl bleibt während der Lebensdauer des Objekts allokiert
  • Type Erasure — Impl kann polymorph sein

Verwendung in der Praxis

PIMPL wird häufig verwendet von:

  • Qt (jedes Widget verwendet PIMPL)
  • Viele proprietäre Bibliotheken
  • Boost (an einigen Stellen)

Wann PIMPL verwendet werden sollte

Verwenden Sie PIMPL, wenn:

  • Sie ABI-Stabilität über mehrere Versionen hinweg benötigen
  • Ihre Header transitiv zu viele Abhängigkeiten einbinden
  • Sie eine öffentliche Bibliotheks-API bereitstellen

Wann Sie darauf verzichten sollten

Verzichten Sie auf PIMPL, wenn:

  • Die Klasse intern ist — keine Consumer hängen von ihrem Header ab
  • Die Performance-Einbuße wichtiger ist als die Build-Zeiten
  • Die Klasse klein ist oder selten geändert wird

Kurzer Test

Warum muss der Destruktor einer PIMPL-Klasse in der .cpp-Datei definiert werden?

Zusammenfassung

PIMPL verbirgt die Implementierung, indem private Daten in eine Impl-Struktur verschoben werden, auf die über unique_ptr zugegriffen wird. Dadurch verbessern sich ABI-Stabilität und Build-Zeiten, allerdings um den Preis einer Indirektion. Definieren Sie spezielle Memberfunktionen in der .cpp-Datei, in der Impl vollständig definiert ist.

Häufig gestellte Fragen

Ist die Lektion „Implementierung mit PIMPL verbergen“ kostenlos?

Ja — der vollständige Text von „Implementierung mit PIMPL verbergen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Implementierung mit PIMPL verbergen“?

Verbergen Sie Implementierungsdetails hinter dem Pointer-to-Implementation-Idiom. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um C++ Academy zu starten?

Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Implementierung mit PIMPL verbergen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?

Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Header-only- vs. kompilierte Bibliotheken
  2. API-Versionierung und ABI-Stabilität
  3. Implementierung mit PIMPL verbergen
  4. Eine moderne Header-only-Utility-Bibliothek schreiben
← Zurück zu C++ Academy