Je nach Bedingung unterschiedlicher Cast
-
Hallo,
ich habe eine Bedingung und die Anforderung soll sein, je nach Bedingung eine Variable auf einen unterschiedlichen Typ zu casten. Da ich nicht jedes Mal aufs Neue schreiben möchte:
if(bedingung == 1) Object1 var = (Object1)GetVar(); else if(bedingung == 2) Object2 var = (Object2)GetVar(); usw...
wollte ich fragen, ob es eine andere Möglichkeit gibt, die mir das erspart und an die ich gerade nicht denke. (Am besten eine Membervariable, die immer dem passenden Typ entspricht.)
Danke!
-
Wie wäre es damit:
Object1 var = (Object1)GetVar(); Object2 var = (Object2)GetVar();
Anaonsten müsstest du dich ein bisschen konkreter ausdrücken, was du eigentlich willst.
-
Ich denke mal es geht schlicht und ergreifend dadrum von einen Objekt dessen wahren Typ man kennt automatisiert zu Casten.
z.B. gibts ein Enum Type { Bool, Integer, Float}
jetzt sollte sowas gehenif ( Type == Bool )bool var = static_cast<bool>(GetVar()); if ( Type == Integer)integer var = static_cast<bool>(GetVar()); ...
Ich denke nur das die Typen verschiedene Ableitungen ein und derselben Basisklasse sind.
-
Fedaykin schrieb:
Ich denke mal es geht schlicht und ergreifend dadrum von einen Objekt dessen wahren Typ man kennt automatisiert zu Casten.
Richtig!
Fedaykin schrieb:
Ich denke nur das die Typen verschiedene Ableitungen ein und derselben Basisklasse sind.
Ebenfalls richtig! Aber um an die speziellen Funktionen der abgeleiteten Klassen zu kommen (oder ein Objekt der abgeleiteten Klasse zu erstellen), muss ich das Basisobjekt darauf casten.
Die Frage lautet also lediglich, wie ich verhindern kann, jedes Mal wenn ich das tun muss, eine Abfrage zwischen 20 verschiedenen Typen starten zu müssen um herauszufinden, um welchen Typ es sich gerade handelt und ein Objekt welchen Typs ich gerade erstellen muss.
-
Ahalex schrieb:
Die Frage lautet also lediglich, wie ich verhindern kann, jedes Mal wenn ich das tun muss, eine Abfrage zwischen 20 verschiedenen Typen starten zu müssen um herauszufinden, um welchen Typ es sich gerade handelt und ein Objekt welchen Typs ich gerade erstellen muss.
Du musst am Design was umstellen.
Da du nichts darüber schreibst was du eigentlich versuchst zu machen kann man nur raten.
Visitor Pattern vielleicht.
http://en.wikipedia.org/wiki/Visitor_pattern
-
Ohne C++ und dem Rumgecaste an Klassen würde es in reinem C auf Rumgecaste an dem eigentlich auszuführenden Code sprich den Funktionen selbst herauslaufen, und das müsste deinen Anforderungen doch genügen?
z.B.enum { PLUS,MINUS,MAL }; void plus(int i,int j) {printf("%d\n",i+j);} void minus(int i,int j){printf("%d\n",i-j);} void mal(int i,int j) {printf("%d\n",i*j);} #define dispatch(x) ((x)==PLUS?plus:(x)==MINUS?minus:mal) dispatch(PLUS)(2,5); dispatch(MINUS)(1,99); dispatch(MAL)(5,5);
Den Parameter an dispatch kannst du ja entsprechend deinen Bedingungen dynamisch gestalten.
Mit C++ geht es auch ohne Casts,falls dir Dispatching auf Methodenebene reicht; du hast dann alles in einer Klasse:
enum { PLUS,MINUS,MAL }; class D { int x; void plus(int a,int b){printf("%d",a+b);} void minus(int a,int b){printf("%d",a-b);} void mal(int a,int b){printf("%d",a*b);} public: D(int p){x=p;} void doit(int a,int b){ switch(x) { case PLUS: plus(a,b);break; case MINUS: minus(a,b);break; case MAL: mal(a,b);break; }}};
D plus(PLUS),minus(MINUS),mal(MAL); plus.doit(1,2); minus.doit(3,4); mal.doit(5,6);
Auch hier kannst du deine Bedingungen an den Konstruktor geben.