Ich entwickle eine Bibliothek. Ich habe Interface-Klasse, die von außen aufgerufen werden würde.Verbergen der Implementierungsdetails durch Reduzieren der Anzahl der aufgefüllten Header
Ich habe auch einen internen Motor, der nicht von außen aufgerufen werden sollte.
Während ich hier und da lese, sollte ich die interne Engine-Klasse verstecken und nicht einmal ihren Header auffüllen. Da habe ich die folgende Struktur:
interface.hpp:
#include "engine.hpp"
class interface{
private:
enigne eng;
};
interface.cpp:
#include "engine.hpp"
//code that uses member variables and functions from eninge
engine.hpp:
class engine{};
Um das Problem zu bevölkern "engine.hpp" zu lösen, sollte ich den Code ändern:
interface.hpp:
class engine;
class interface{
private:
some_smart_pointer<enigne> eng_ptr;
};
interface.cpp:
#include "engine.hpp"
//code that uses member variables and functions from eninge
enigne.hpp:
class engine{};
Dies löste das Problem. Ab jetzt wird engine
dynamisch zugewiesen. Alle seine Mitgliedsvariablen befinden sich im freien Speicher.
Ich kann nicht verstehen, dass ich mein Design ändern und Engine auf dem freien Speicher zuweisen muss, um das Problem des Verbergens der Implementierungsdetails zu lösen. Gibt es eine bessere Lösung?
P.S. Ich frage nicht, warum diese Lösung funktioniert. Ich weiß, dass es darum geht, die Größe der Triebwerksklasse zu kennen, wenn ich sie im Stapel lassen würde. Meine Frage besteht darin, nach einem anderen Design zu fragen, das das Problem lösen könnte.
EDIT:
Beide interface
und engine
haben Membervariablen.
Jede angebotene Lösung wird Ihre Implementierung nur erschweren. Wenn Ihnen die Kosten für die Verwendung der Standard-Allokatoren Sorgen bereiten (Metadatenverschwendung und/oder -geschwindigkeit), [können Sie immer Ihren eigenen Allokator schreiben] (http://www.gotw.ca/gotw/028.htm) – StoryTeller
If ' Interface' hat keine Member und nur virtuelle Funktionen, Sie können 'Engine' komplett ausblenden. – Jarod42
Es gibt immer eine Hacky-Lösung: Verwenden Sie eine einzelne private 'char Daten []' und 'static_cast (Daten)'. Aber das ist ein Wartungs-Albtraum und * wirklich * hacky. Stattdessen wird das Schreiben eines eigenen Zuordners wahrscheinlich fast genauso effizient, aber viel sauberer sein. Natürlich * messen * Sie zuerst, wenn PIMPL wirklich ein Performance-Engpass ist, bevor Sie vorzeitige Optimierungen vornehmen. –