Kapseln einer Bibliothek (Probleme mit Schnittstelle)
-
Hallo!
Folgendes Problem:
Ich will eine Bibliothek (SDL, wenn es jemanden interessiert) in einer Klasse kapseln.
Dabei kommen einige inline Funktionen vor, und diese können ja nur im Header
definiert werden. Dazu muss ich aber leider in der Schnittstelle die Header der
Datei der zu kapselnden Bibliothek einbinden... der Anwender meiner Klasse soll
aber keinen Zugriff mehr auf die Bibliothek selbst haben!
Und außerdem wird die Schnittstelle der Bibliothek ja auch für manche Datentypen
benötigt, die im private Bereich der Klasse gebraucht werden.Hier meine Schnittstelle:
#ifndef __GFX_H__ #define __GFX_H__ #include "SDL.h" // Das will ich eigentlich vermeiden... class CGfx { public: // ... void FlipScreen { SDL_Flip(screen); } private: // ... SDL_Surface* screen; }; #endif
Wenn jetzt meine Schnittstelle "gfx.h" irgendwo eingebunden wird, dann stehen
automatisch (durch das #include "SDL.h") alle Funktionen der SDL zur Verfügung,
ich will aber, dass dies nur über meine Klasse geschieht...Bin für jede Antwort dankbar.
gruß,
walker
-
das ist nicht möglich. Du könntest die privaten Daten mit dem Pimpl-idiom auslagern und die Funktionen in der gfx.cpp definieren und dort explizit inlinen.
Dadurch währe das SDL.h zeugs nicht für den User verfügbar. Aber die Funktionen währen nur inerhalb der gfx.cpp inline und nicht im UserCode, da der Compiler nur inlinen kann wenn er an die Definition kennt.
-
Vielen Dank!
Ich werde die Links mal in Ruhe durchstudieren...
gruß,
walker
-
Und mach nicht denselben Fehler wie ich und beiß dich zu sehr am Inlining fest - der Funktionsaufruf mehr wird bei komplexeren Sachen wie dem Zeichnen einer Grafik auch keinen Unterschied machen
Für pimpl finde ich boost::scoped_ptr (www.boost.org) als Standardlösung ganz brauchbar. Damit kann man nicht mehr viel falsch machen (man muss aber trotzdem noch einen leeren Destruktor in die .cpp schreiben). Ich glaube, da liegt sogar ein Beispiel bei, wie man das pimpl-Idiom damit realisiert.