Objekt typ rausfinden über die basis klasse!!
-
MFK schrieb:
Du hast aber hoffentlich nicht B und C nur deswegen von A abgeleitet, damit du sie gemeinsam in dieses Array packen kannst, oder?
mal angenommen, man möchte das aber unbedingt so haben (alles objekte in einem array, liste, etc.). gibt es denn eine andere möglichkeit als vererbung?
alles als void* zu speichern ist ja noch blöder...
-
ja ein meinem fall will ich zwei verscheidne typen in einem array speichern!!
-
BorisDieKlinge ist ein Frickler der allerübelsten Sorte.
-
net schrieb:
MFK schrieb:
Du hast aber hoffentlich nicht B und C nur deswegen von A abgeleitet, damit du sie gemeinsam in dieses Array packen kannst, oder?
mal angenommen, man möchte das aber unbedingt so haben (alles objekte in einem array, liste, etc.). gibt es denn eine andere möglichkeit als vererbung?
alles als void* zu speichern ist ja noch blöder...Man kann sich mal eben was zusammenhacken:
struct AorB { enum {typeA, typeB} type; AorB (A const & a) : type (typeA) , b (0) { new (memory) A (a); this->a = reinterpret_cast<A*>(memory); } AorB (B const & b) : type (typeB) , a (0) { new (memory) B (b); this->b = reinterpret_cast<B*>(memory); } ~AorB () { if (type == typeA) a->~A(); else b->~B(); } AorB & operator = (A const & a); AorB & operator = (B const & B); AorB (AorB cosnt &); AorB & operator = (AorB cosnt &); private: char memory [sizeof(A)>sizeof(B)?sizeof(A):sizeof(B)]; A * a; B * b; };oder man nimmt boost::any oder die beste Möglichkeit: boost::variant.
-
Helium schrieb:
Man kann sich mal eben was zusammenhacken:
hehe, lustiger trick mit diesem 'placement new' usw.

hast du dir das mal eben selbst ausgedacht oder wird sowas allgemein in c++ so gemacht?
naja, ist wohl umständlich zu erweitern, wenn noch 'ne dritte oder vierte klasse dazu soll...Helium schrieb:
oder man nimmt boost::any oder die beste Möglichkeit: boost::variant.
ich will ja nicht wissen, wie *das* gehackt ist

-
net schrieb:
hast du dir das mal eben selbst ausgedacht oder wird sowas allgemein in c++ so gemacht?
Ich hatte mir irgendwann mal überlegt, wie man genau das hier besprochene Problem lösen könnte. Erst hatte ich 'ne union, aber die funktioniert ja nur mit primitiven Typen, und dann ist mir eben das eingefallen. Natürlich hatte ich mir das als Template gebaut, statt mit den konkreten Typen A und B.
(Da gabs noch kein boost::variant.)Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.
-
Helium schrieb:
Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.
oder diese eingebauten features 'dynamic_cast' und 'typeid' ...
-
net schrieb:
Helium schrieb:
Aber allgemein würde ich vorschlagen einfach boost::variant zu verwenden.
oder diese eingebauten features 'dynamic_cast' und 'typeid' ...
Du solltest dir erstmal anschauen was boost::variant ist. Zu boost::any würde deine Aussage bedingt passen, aber zu boost::variant nicht.
boost::any ist nicht gehackt, es ist sehr sauber und typsicher implementiert.
Edit:
Zu empfehlen ist folgendes Buch
-
was ist ein Frickler ??? ->KennerDerKlinge
-
ein Frickler ist jemand der frickelt. Frickeln bedeutet zurechtbasteln.