Klassen-Frage...



  • Hi,

    ich schreibe im Moment ein Framework für 2d in DirectX8. Sprites sollen als Objekte zusammengefasst werden in deren Klasse dann z.B. Frame-Grössen, abzuspielende Sounds, aktuelle Position usw. verwaltet werden sollen. Sprich: ich erstelle eine Klasse namens CSprite und pack da die Variablen für das ganze Sprite rein. Da sich Sprites aber oft sehr voneinander unterscheiden und anders behandelt werden müssen bzw. noch zusätzliche Methoden für verschiedene Sprites implementiert werden müssen dachte ich ich erstelle eine Basisklasse mit allem "normalerweise" benötigten Methoden und Variablen, und für Spezialfälle vererbe ich die eigenschaften der Basisklasse in eine neue Klasse speziell für diese Art von Sprites. Das Problem bzw. die Frage ist jetzt kann ich die Problemlos (zusammen bzw. per typecast) in einer Liste oder einem Vektor verwalten, obwohls ja so gesehn unterschiedliche Klassen sind....oder wie würdet ihr so ein Problem lösen? Wäre dankbar für Vorschläge 😃

    mfg Notrix

    PS: Sorry für die komplizierte Erklärung, aber ich muss gleich auf die Arbeit :p



  • wieso casten? wenn du nen vektor mit typ basisklasse erstellst kannst du problemlos vererbte klassen der basisklasse reinschmeissen.



  • Hmm, echt?

    Ich meine das mal versucht zu haben, aber es ging nicht...aber ich kann mich auch irren, is schon ne Weile her.

    Macht das nicht Probleme weil die Klassen dann unterschiedlich gross (im Speicher mein ich) sind? Da die vererbte Klasse ja mehr Variablen bzw. Methoden hat?

    mfg Notrix



  • Deswegen kannst du nur Zeiger bzw. Referenzen speichern.



  • Jo, aber du musst doch beim erstellen angeben was für ein Typ du als Vektor haben willst. Und von diesem Typ holt er sich doch die Grösse um Speicher zu reservieren, oder seh ich das jetzt völlig falsch?

    Naja, egal, wenn ihr der Meinung seid es geht, dann werd ichs ausprobiern.
    Und wehe es geht nicht 😃

    mfg Notrix



  • #include <vector>
    #include <iostream>
    
    using namespace std;
    
    class klasse1
    {
    public:
    	klasse1() {};
    	virtual ~klasse1() {};
    
    	virtual void print() { cout << "Ich bin die Basisklasse" << endl; };
    };
    
    class klasse2 : public klasse1
    {
    public:
    	klasse2() {};
    	virtual ~klasse2() {};
    
    	virtual void print() { cout << "Ich bin die zweite Klasse" << endl; };
    };
    
    class klasse3 : public klasse2
    {
    public:
    	klasse3() {};
    	~klasse3() {};
    
    	void print() { cout << "Ich bin die dritte Klasse" << endl; };
    };
    
    int main()
    {
    	klasse1 c1_value;
    	klasse2 c2_value;
    	klasse3 c3_value;
    
    	vector<klasse1*> container;
    	container.push_back(&c1_value);
    	container.push_back(&c2_value);
    	container.push_back(&c3_value);
    
    	for(unsigned int i=0; i<container.size(); i++)
    		container[i]->print();
    
    	return 0;
    }
    

    mal schnell was getippt, fehler dürfen aufgedeckt werden 😉



  • Okok 😉

    ich seh's ein... ihr habt Recht... es geht.
    Mein Problem war damals (ich hab nachgesehn) das ich die vererbten Klassen erst in die Basisklasse zurückholen wollte, also so:

    class CFirst
    {...};
    
    class CSec : public CFirst
    {...};
    
    vector <CFirst> container;
    .
    .
    .
    
    CFirst=container[i];
    CFirst->Render();
    .
    .
    .
    

    was natürlich nicht funktioniert...ok, alles klar, danke für die vielen, und vor allem schnellen Antworten!

    mfg Notrix


Anmelden zum Antworten