Nochmal frage zwecks Klassenstructur?
-
folgende Konstellation:
class B : public Basis{ B(...) : Basis(...); ~B(); }; class A : public Basis{ A(...) : Basis(...); ~A(); }; class Basis{ Basis(...); vitrual ~Basis()=0; }; class Kombination{ . . . . . std::list<Basis*> LIST; };HAbe eine klasse "Kombiantion" welches nur Abgeleitet Objekt von Basis enthalten kann, da Basis abstact ist! Beim erzeugen des kombinations- Objekts soll schon ein Objekt in die Liste gepushed werden. Wie kann ich beim erzeugen des Kombiantionobjetks dem Kombiinationobjekt sagen das es entweder nur A oder nur B objekte enthält??
Template?
-
Beim erzeugen des kombinations- Objekts soll schon ein Objekt in die Liste gepushed werden.
Du könntest dem Ctor das erste Objekt mitgeben, das du in die Liste packen willst.
Wie kann ich beim erzeugen des Kombiantionobjetks dem Kombiinationobjekt sagen das es entweder nur A oder nur B objekte enthält??
Wie meinen?
(PS: Vielleicht solltest du etwas langsamer schreiben und die Texte vor dem Abschicken auf auffällige Rechtschreibfehler überfliegen ;))
-
ok wenn ich ein Kombinationobjekt erzeuge, würd ich dem Objekt gern den Typ (in dem fall A oder
mitteilen, was es später enthalten soll?class Kombination{ Kombination(/*TYP*/){ } };
-
Du meinst, die Klasse soll entweder nur A-Objekte oder nur B-Objekte enthalten? Das bekommst du auf Compiler-Ebene nicht hin, wenn du die Daten intern in einen vector<Base*> packst. Mit der Konstellation kannst du nur zur Laufzeit abfragen, ob der tatsächliche Typ "passt".
Die Alternative wären Templates:
//Klasse Kombination<A> schluckt keine B-Objekte und umgekehrt template<typename T> class Kombination { std::list<T> LIST; ... };
-
jepp genau..
hab ich mir gedacht, das man das nur mit Template lösen kann... naja ist nich so schlimm:)
-
So wie CStoll vorgeschlagen hat, einfach zwei Konstruktoren definieren:
class Kombination { Kombination(const A* a) { LIST.push_back(a); } Kombination(const B* b) { LIST.push_back(b); } };Dies hat natürlich den Nachteil, daß die Basisklasse die Typen A und B kennen muß. Evtl. solltest du dann lieber eine Hilfsfunktion dafür generieren.