Funktionstemplate
-
Hallo,
in einer statischen Library steckt in etwa folgende Funktion:
Object* getObject() { if(!p_Object) { p_Object = new Object; } return p_Object; }Die Funktion wird aus der Main heraus aufgerufen. Nun möchte ich die Funktion gerne so ändern, dass sie aufgerufen werden kann ohne vorher zu wissen um was für ein Objekt es sich handelt ( Template!? ). Grund: die Klasse des zu erzeugenden Objektes ist ebenfalls ein Template und muss zuvor in der Main ausgeprägt werden.
z.B.
typedef Klasse<int> ObjectEs gibt noch mehr Funktionen, die entsprechend komplexer sind und auf diesem Wege alle in der Lib verschwinden sollen.
Ich hoffe, ich habe mich verständlich ausgedrückt.
Schon mal Danke und schöne Grüße!
-
meinst du sowas wie
template<class T> T* getObject() { if(!p_Object) { p_Object = new T; } return p_Object; }Was du da machst sieht so ein wenig nach dem Singleton Pattern aus (Klasse von der es hoechstens eine Instanz gitb) - dabei gibts einige Fußangeln und Fallen, also wenns sowas ist vielleicht auch mal nach googeln

-
Du kannst templates in einer Library zusammenfassen, allerdings muss alles inline Implementiert werden, sonst packen das die Compiler nicht so ganz (kein einziger C++ Compiler unterstützt "export" vollständig, die meisten garnicht).
Soll heissen: die Files liegen dann zwar in einem "Library-Verzeichnis", allerdings wird der Code nicht aus der .lib mit gelinkt, sondern einfach mit ins Programm includiert.
-
Danke für eure Antworten. Hab es heute noch einmal ausprobiert und in etwas so gelöst.
template<class p_EO> p_EO* lib_getObject( p_EO*& peo ) { if (!peo) { peo = new p_EO; } return peo; }
-
Hi,
ich muss gestehen, dass ich mit "EO/eo" so überhaupt nichts assoziieren kann.
Falls ich nicht der Einzige sein sollte, würde ich an Deiner Stelle einen anderen Namen wählen.Gruß,
Simon2.
-
EO ist die Abkürzung für einen Bezeichner den ich benutze. Es reicht ja wenn ich etwas damit anfangen kann.
Ich wollte ja nur allen Interessierten zeigen, wie eine Lösung zu dem von mir gestellten Problem aussehen kann. Aber warum soll ich mein Beispiel nicht etwas übersichtlicher gestallten?
Also...FUNKTION: Irgendwo in einer Lib.
template<class Objekttyp> Objekttyp* lib_getObject( Objekttyp*& p_MyObject ) { if (!p_MyObject) { p_MyObject = new Objekttyp; } return p_MyObject; }AUFRUF:
typedef EineTemplateKlasse<int> ausgeprägteKlasse //'int' ist nur ein Beispiel class irgendwas { public: //..... private: void machWas(); ausgeprägteKlasse* p_ausKla; }; void irgendwas::machWas() { ausgeprägteKlasse* p_ausKlaConnector = lib_getObject( p_ausKla ); if(!p_ausKlaConnector) { //Errormeldung return; } p_ausKlaConnector->connectBeispiel(); }So in etwa sieht das aus, was ich damit gemacht habe.
Schöne Grüße!