Yo, keine Ahnung, was ich als Einleitung schreiben soll.
Was ist das D-Pointer Pattern?
Das D-Pointer Pattern (auch "Pimpl Idiom" genannt) ist ein Design-Pattern für Klassen.
Vorteile
- bessere Übersicht über Klassenmember
- verbesserte Compile-Performance
- binäre Kompatibilität
Was ist binäre Kompatibilität?
Wenn ihr die Memberattribute einer Klasse in der Header-Datei deklariert, wird diese immer wieder neu compilet, wenn ein Attribut geändert/hinzugefügt/entfernt wird (inkl. includes etc).
Das wird durch das D-Pointer Pattern "verhindert", da die Attribute nicht direkt in der Header-Datei deklariert werden.
Wie es genutzt wird
Kurze Erklärung für den Anfang:
Man forward-declared eine neue Klasse in der Header-Datei, deklariert diese in der Source-Datei, packt die eigentlichen Attribute da rein, erstellt in der Klasse einen Pointer auf die neu erstellte Klasse und greift auf die Attribute über den Pointer zu.
Diese neu erstellten Klassen heißen normaler Weise "...Data"
Wenn eure Klasse "Person" heißt, wäre der Name der D-Pointer Klasse also "PersonData".
Daher auch der Name D-Pointer Pattern - d steht für data
Nun zum praktischen Beispiel.
Dafür nutze ich einfach mal diese Klasse:
Wie ihr sehen könnt, wurden alle Attribute einfach als private Member in der Klasse deklariert.
Würde man eine davon nun ändern, würde der Compiler die ganze Header-Datei neu compilen, alle includes neu linken, etc.
Wenn man dann noch Frameworks, wie Qt, nutzt, kann das schon einen großen Zeitunterschied machen.
Der erste Schritt wäre nun die forward-declaration der Data Klasse:
Wer wissen will, was eine forward-declaration ist, sollte sich das hier durchlesen: Bitte melden Sie sich an, um diesen Link zu sehen.
Man könnte theoretisch auch eine nested-class erstellen, ist aber unnötig.
Im Source-File sollte dann die Deklaration der neuen Klasse sein:
(habe für die Attribute einfach mal standardmäßig get/set Methoden gemacht)
Im nächsten Schritt "löscht" ihr die Memberattribute aus der eigentliche Klasse und deklariert sie als public-Attribute in der Data-Klasse:
(ich habe dem Industrie-Standard befolgt und die m_ Notation entfernt)
Die Attribute müssen als public member deklariert werden, da ihr sonst nicht über einen Pointer drauf zugreifen könntet.
Als nächstes deklariert ihr einen PersonData-Pointer in der Person-Klasse:
Am Ende initialisiert ihr den PersonData-Pointer im Konstruktor, ruft die Attribute über den Pointer auf und erstellt einen Dekonstruktor um Memory Leaks zu vermeiden:
Schlusswort
Habe für die Benennung der Klassen, Attribute usw den herrschenden Standard befolgt. Im Grunde ist es eigentlich völlig egal und beeinflusst die eigentliche Methode nicht.
MfG Remix