IMPLEMENT_SERIAL und Kein Standardkonstruktor verfügbar
-
IMPLEMENT_FACTORY in einem anderen Modul sammeln, dass zwingend gelinkt wird.
Oder Erzeuge mindestens eine referenz auf ein Objekt von diesen Typen.Oder erzwinge durch ein pragma das ein entsprechendes Symbol aus diesem Objekt Modul eingelinkt wird.
#pragma comment(linker, "/include:forceSomeSymbolTobeIncluded")
-
Danke nochmal für deine Hilfe.
IMPLEMENT_FACTORY in einem anderen Modul sammeln, dass zwingend gelinkt wird.
Dann muss ich das irgendwo in eine .cpp packen mit dem das ganze eigentlich gar nichts zu tun hat.
Oder Erzeuge mindestens eine referenz auf ein Objekt von diesen Typen.
Ja dann bin ich ja soweit wie zuvor. Dann muss ich ja doch für jede Klasse ein Objekt oder auch nur eine Referenz anlegen und das ganze ist nicht mehr dynamisch.
#pragma comment(linker, "/include:forceSomeSymbolTobeIncluded")
Und das muss ich dann für jede meiner Klassen machen.
Bei allen 3 Möglichkeiten muss ich dann für jede Klasse von der ich ein Objekt dynamisch erzeugen will etwas an einer zentrallen Stelle pflegen. Dann sehe ich aber noch keinen Vorteil zu meinem ursprünglichen switch case oder einer map in der ich auch alle Klassen pflege?
Seit wann ist das so. Ich habe IMPLEMENT_SERIAL schon mal in einem Projekt verwendet.Und das in VS 2003. Dort musste ich nichts von all dem machen. Nun in VS2008 geht das nicht mehr?
Gibts da keine andere Möglichkeit?
-
Also ich weiß nicht was Du für Probleme hast.
Ich habe meinen Sample Code von oben auf mehrere CPP Dateien verteilt.
baseclass.cpp
obj1.cpp
obj2.cpp
obj3.cppIm Main habe eich eine Schleife gebaut, die nur dynamisch die Token-Ids anspricht.
int _tmain(int argc, _TCHAR* argv[]) { for (int i=1; i<4; ++i) std::auto_ptr<CObjBase> p1(CFactory::CreateObject(i)); return 0; }
Ich bekomme sowohl in Debug als auch in der Release Version die korrekte Ausgabe.
CObj1::CObj1
CObj1::~CObj1
CObj2::CObj2
CObj2::~CObj2
CObj3::CObj3
CObj3::~CObj3
Drücken Sie eine beliebige Taste . . .
-
Also ich weiß nicht was Du für Probleme hast.
Wenn ich das wüßte würde ich nicht fragen. Keine Ahnung wieso??
In dem Beispiel geht es, nur nicht in meiner Applikation. Kann es daran liegen, dass das ganze in einer statischen Lib implementiert wurde.
-
visualer schrieb:
In dem Beispiel geht es, nur nicht in meiner Applikation. Kann es daran liegen, dass das ganze in einer statischen Lib implementiert wurde.
Ja! Und warum verätst Du das erst jetzt, dass Du keine normale Anwednung oder DLL hast?
Ich habe extra den test gemacht: Statische Objekte aus eoinem Modul in einem Projekt einer EXE/DLL werden automatich eingebunden. Für Code sieht das anders aus.
Denk mal nach! Meinst Du im ernst jedes Stück Code au einer statischen Lib wird in eine EXE gepackt? Es wird nur das aus einer statischen LIB verwendet was auch benötigt wird.
Wenn also jedes dieser getrennten Module gelinkt werden soll, dann muss ein Modul aus der statischen Lib geladen werden, dass eben alle diese Module nutzt...
-
Ok was soll ich sagen. Ich wußte es halt nicht. Sorry.
Wenn ich das nun mit
#pragma comment(linker, "/include:forceSomeSymbolTobeIncluded")
mache. Wo muss ich das platzieren. Und was muss ich für forceSomeSymbolTobeIncluded eigeben. Eine Variable oder eine Funktion die die Klasse beinhaltet?
-
Du platzierst das in einem Objekt Modul, dass in jedem Fal aus der statischen Lib gebunden wird.
forceSomeSymbolTobeIncluded kann eine Variable sein, oder eine Funktionsname, das ist wurscht. Aber Achtung bzgl. C++ name decoration.Siehe Linker Doku...
-
Ok. Danke
Es gibt also keine Möglichkeit etwas in dem Modul zu platzieren in der sich die Klasse befindet von dem das Objekt erzeugt werden muss?
-
Wie denn?
Ein C++ Modul kann ein anderes doch nicht manipulieren.
Einen Bezug über irgend ein Symbol musst Du schon selber herstellen zwischen einem C++ Modul und einem anderen.
-
Na keine Ahnung. Dachte halt da gibt es so was wie: "Link mich auf jeden Fall ich bin wichtig oder so".