Implementierungen von Template-Klassen (teilweise) kapseln und verstecken
-
Gibt es grundsätzlich Möglichkeiten, Implementierungen von Template-Klassen zu kapseln und zu verstecken?
Grundsätzlich muss ja die gesamte Definition mit im Header-File stehen. Gibt es aber Techniken/Idome, um Implementationen zu mindest teilweise aus der Header-Datei zu verbannen?
Konkretes Beispiel, wo ich das benötigen würde:
template< class TModule > struct ModuleStarter : public TModule{ ModuleStarter(TModule& module) : TModule(module){ TModule::Start(); } ~ModuleStarter(){ TModule::Stop(); } }ModuleStarter startet und beendet Module. Wenn ich nun einen speziellen ModuleStarter implementieren möchte, der nun Betriebssystem-spezifische Dinge vor und nach dem Starten erledigen soll, wie macht man das am besten?
// Beispiel (Prinzip): template< class TModule > struct ConsoleModuleStarter : public TModule{ ConsoleModuleStarter(TModule& module) : TModule(module) { Run(); } ~ConsoleModuleStarter(){ } void Run() { // Console anlegen // Consolen-Handler anlegen TModule::Start(); // Wenn Abbruchsignal von Console kommt --> TModule::Stop() // Wenn TModule::Start() beendet wurde --> Konstruktor verlassen } void Stop(){ TModule::Stop(); /* Vorzeitiger Abbruch */ } }
-
Du kannst natürlich deine Implementierungen in eine beliebige andere Datei auslagern, musst die halt am Ende des Header-Files includen.
-
Ein etwas aufwändiger Weg (aber dafür sind die Methoden dann wirklich "versteckt") wäre, wenn du entweder eine (weitere) Basisklasse oder aber ein Member der Klasse 'Console' anlegst und von deiner Template-Klasse 'ConsoleModuleStarter' dann entsprechende Methoden aufrufst.
Und die Klasse 'Console' erstellst du dann ganz normal mit einer Source- und einer Header-Datei (und letztere dann einfach von deiner Template-Datei inkludieren).Ich nehme dabei an, daß die Klasse 'Console' keine Template-Klasse ist und nicht abhängig von TModule!
-
Möhre schrieb:
Du kannst natürlich deine Implementierungen in eine beliebige andere Datei auslagern, musst die halt am Ende des Header-Files includen.
Dann würde ich nur gliedern, aber den Code nicht wirklich "Verstecken" im Sinne von Kapseln.
Th69 schrieb:
Ein etwas aufwändiger Weg (aber dafür sind die Methoden dann wirklich "versteckt") wäre, wenn du entweder eine (weitere) Basisklasse oder aber ein Member der Klasse 'Console' anlegst und von deiner Template-Klasse 'ConsoleModuleStarter' dann entsprechende Methoden aufrufst.
Und die Klasse 'Console' erstellst du dann ganz normal mit einer Source- und einer Header-Datei (und letztere dann einfach von deiner Template-Datei inkludieren).Ich nehme dabei an, daß die Klasse 'Console' keine Template-Klasse ist und nicht abhängig von TModule!
Ja, so habe ich es auch erst einmal gemacht. Angenommen ich habe jetzt den Fall, dass die Klasse Console dann abhängig von TModule ist. Bzw. z.B. von einem Teil (Schnittstelle, Basisklasse). Gibt es da eine Möglichkeit, die Klasse Console und TModule über eine (Nicht-Template-Basisklasse) zu verknüpfen?
-
Dann müßte TModule jeweils von einer nicht-template Basisklasse erben, so daß Console nur diese Basisklasse benutzt (mit virtuellen Methoden).