Vektoren mit verschiedenen Typen, bzw. erbenden Klassen
-
Erstmal danke für die schnellen Antworten!

Aber wenn ich dem Lösungsvorschlag von SeppJ folge:
(PS: ich habe in der Klasse ErbeI einen int var hinzugefügt)
ErbeI erbI; erbI.var = 5; vector<ErbeI> foo(3,erbI); vector<object*> foobar; foobar.push_back(&foo[0]); foobar.push_back(&foo[1]); foobar.push_back(&foo[2]); cout<<foobar[0]->var<<endl;...wird mir vom Compiler gesagt, dass die Klasse object keine Variable mit dem Namen "var" besitzt, da der Vektor ja sogesehen auch nur für object ist.
Das stimmt ja, aber mein Ziel ist es, auch auf die Funktionen, Variablen etc. der erbenden Klassen zugreifen zu können.
Ich könnte natürlich in diesem Fall auf den Vector foo zurückgreifen, aber dies wäre ja ein zweiter Vector, ich habe aber eigentlich vor, einen einzigen Vektor mit allen Eigenschaften der jeweiligen Objekte zu erstellen.Oder mache ich hier beim Zugriff auf die Eigenschaften der Erben einen Fehler?
Eine Rückmeldung würde mich erfreuen.
-
Das was du jetzt brauchst, ist dass du irgendwie feststellen musst, ob das Objekt auf das foobar[0] zeigt auch wirklich ein ErbeI ist. Das kannst du dem Compiler entweder zur Compilezeit mit einem Cast sagen, was keinen Sinn macht, denn wenn du es wüsstest, dann bräuchtest du die Objekte ja gar nicht erst in einen Container für mehrere Objekttypen stecken. Wenn du es daher zur Laufzeit rausfinden willst, dann musst du eine Form von RTTI benutzen, das kann der dynamic_cast sein, oder auch typeid oder irgendwelche Tricks mit dem Adressoperator.
Aber wie ich dir auch schon gesagt habe, hast du vermutlich ein Problem das viel einfacher gelöst werden kann. Denn diese Art der Programmierung deutet sehr oft auf ein grundlegendes Designproblem hin. Es sollte fast nie nötig sein, den Typ eines Objektes zur Laufzeit zu bestimmen.
-
Aber wieso sollte ich in diesem Fall prüfen, ob foobar[0] wirklich auf ein ErbeI zeigt? Es ist hier doch sicher, dass auf ErbeI gezeigt wird, oder nicht?
-
Das weißt du - der Compiler weiß nur, daß in foobar Zeiger auf Basis-Objekte enthalten sind.
-
OK, danke!
Zu den typeids:
nehmen wir mal an, ich würde typeid verwenden, wie müsste das Programm dann lauten?
-
1. Würde man dazu eher dynamic_cast benutzen in dieser Situation, aber typeid ginge ähnlich.
2. Für all das muss Polymorphie vorliegen, damit der entsprechende Code vorliegt. Vermutlich ist Polymorphie sowieso der Problemlöser den du suchst, ganz ohne typeid oder dynamic_cast, aber du reagierst leider nicht auf Stichworte, noch stellst du dein eigentliches Problem dar. Derzeit sind dein Klassen nicht Polymorph. Mach zur Not eine dummy-Funktion virtuell. Oder den Destruktor, was man ohnehin machen muss, falls du später mal auf die Lösung mit dem new/delete umsteigen willst.
3. Beispiele findet man gut bei Google.
-
Dann versuche ich mal mein Problem klarer darzustellen:
Die vorangegangenen Beispiele sollten nur die Problemstellung, die ich meinte, vereinfachen, aber ich werde jetzt mal explizit:
Also:
Momentan bin ich dabei, ein 2D-Vogelperspektiven-Spiel zu programmieren. Dieses Spiel beinhaltet u.a.
|graphicsobject|->|object|->|usable_ob |->|fridge|
(unvollständig)
Dazu gibt es eine map-class, welche wegen der Flexibilität auf Vektoren basieren soll.
So:
Nun, wenn ich mit meinem Männchen z.B. einen fridge benutze und etwas esse, ändert sich die Menge an Essen im fridge.Aber da meine Map ja nur object und keinen fridge oder sonstiges kennt, da sie ja aus objects besteht, kann ich auf die Variable Menge beim fridge nicht zugreifen.
Habe ich jetzt mein eigentliches Problem dargestellt?
-
Heringsalat100 schrieb:
Habe ich jetzt mein eigentliches Problem dargestellt?
Jupp. Und ich bin überzeugter denn je, Polymorphie wäre die Lösung.
-
Jetzt habe ich ja wenigstens eine Richtung, in die ich weiter erfragen kann...
Erstmale danke, dass du immer noch rückantwortest!

Nehmen wir dann an, ich nehme Polymorphie.
Inwiefern muss ich virtual benutzen, um meine Variable "Menge" vom "fridge" auch in Vektoren der Klasse "object" berücksichtigen zu können?
class graphicsobject{...}; class object: public graphicsobject{...}; class usable_ob: public object{...}; class fridge: public usable_ob{int Menge;};
-
Die Idee wäre etwas in dieser Art:
class usable_object { public: virtual void use(Hero &)=0; virtual void describe() const =0; virtual ~usable_object()=0; }; usable_object::~usable_object() {} class fridge: public usable_object { unsigned number_of_apples; public: fridge(unsigned number_of_apples): number_of_apples(number_of_apples) {} virtual void describe() const { if (number_of_apples) cout << "Ein Kühlschrank mit " << number_of_apples << "Äpfeln.\n"; else cout << "Ein leerer Kühlschrank.\n"; } virtual void use(Hero& hero) { if (number_of_apples) { cout << "Du isst einen Apfel. Du fühlst dich stärker.\n"; --number_of_apples; hero.increase_health(1); } else cout << "Der Kühlschrank ist leer.\n"; } virtual ~fridge() {} };
-
Danke, diese Lösung funktioniert!

Aber dennoch danke an alle, die geantwortet haben!
