abstrakte DLL-Klasse + std::vector + std::list
-
Ich hab etwa volgenden Code:
class DLL building { protected: int HP; public: building(){} virtual ~building() = 0; }; void main() { std::vector<building*> units(200); std::list<building> buildings; }
Mit VC++ bekomm ich u.a. folgende Fehler:
error C2059: Syntaxfehler : 'constant' error C2259: "building" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden: Siehe Deklaration von 'building' Siehe Verweis auf Instantiierung der kompilierten Klassenvorlage 'std::list<class main::building,class std::allocator<class main::building> >'
Kann mir das einer ins deutsche überstezten, oder sagen, was ich falsch mache?
thx
Glamdring
-
Aua, folgenden mit v!
Und ich hab vergessen zu sagen, dass die Liste Erben von building aufnehmen soll.
mfg
Glamdring
-
class DLL sonstwas { };
ist syntaktisch nicht ganz korrekt. auf 'class' folgt genau _ein_ eindeutiger bezeichner, nicht 2.
-
Ich nehme mal an, DLL ist so ein Export-Makro.
Eine std::list<building> nimmt building-Objekte auf, also "by value" und deshalb auch wirklich *nur* buildings. Da buildings nicht erstellt werden können, geht das nicht.
Polymorphes Verhalten funktioniert nur über Zeiger (und Referenzen, aber das ist hier irrelevant) - du brauchst also z.B. eine std::list<building*>, obwohl in deinem Fall std::list<boost::shared_ptr<building> > besser wäre, da die Gebäude dann in jedem Fall korrekt freigegeben werden.
-
Ok, ich hab ne Startklasse dazu geschrieben, die nen virtuellen Destruktor und keine Membervariablen hat. Von dieser Klasse hab ich building abgeleitet. Dann hab ich nen smart_ptr für die Oberklasse geschrieben, die logischerweise auch abgeleitete Klassen wie z.B. building aufnehmen kann.
Die Fehler bleiben, es ist kein unterschied
-
Ich hab noch nen Fehler gefunden:
'HP' : Element der Klasse mit DLL-Schnittstellen darf nicht mit DLL-Schnittstelle deklariert werden
versteh ich nicht, wie solls denn dann in ner DLL gespeichert werden???
Kann man das irgendwie usstellen??thx
Glamdring
-
Poste mal ein Minimalbeispiel, das dein Problem zeigt. Und warum hast du einen smart_ptr "geschrieben"? Verwenden reicht doch...
Und DLLs haben mit Standard-C++ nichts zu tun
-
operator void schrieb:
Und warum hast du einen smart_ptr "geschrieben"? Verwenden reicht doch...
Dazu muss man sich erstmal Boost ziehen
operator void schrieb:
Und DLLs haben mit Standard-C++ nichts zu tun
Stimmt
Beispiel:
class DLL Object { public: Object(){} virtual ~Object() = 0; }; class DLL building : public Object { protected: int HP; public: building(){} virtual ~building() = 0; class DLL smart_ptr { private: Object* ptr; public: smart_ptr(); smart_ptr(Object* nptr); ~smart_ptr(); }; smart_ptr::smart_ptr() { throw; } smart_ptr::smart_ptr(Object* nptr) { ptr = nptr; } smart_ptr::~smart_ptr() { delete ptr; } void main() { std::vector<smart_ptr> units(200); std::list<smart_ptr> buildings; }
Etwa so
thx
Glamdring