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


Anmelden zum Antworten