Nowendigkeit und Aufwand? von cast!
-
class Basis{ }; class A : public Basis{ }; class B: public Basis{ }; std::list<*Basis> LIST; LIST.push_back(new A);das erste objekt der Liste ist ja jetzt trozdem ein Objekt vom Typ Basis, und muss casten wie bei (2) oder? oder ist das nicht otwendig wie bei (1)
A *p= LIST.front(); //(1)oder
A *p= static_cast<A*> LIST.front(); //(2)wenn nun ein static_cast notwendig, und es sicher auch immer ein A ist, wie seht es mit der performace aus? wird viel zeit für cast benötigt?
-
Wenn du in der Liste nur A-Objekte lagern willst, solltest du besser eine list<A*> verwenden, dann erübrigt sich der Cast. Andernfalls ist der Cast notwendig, weil der Compiler nicht wissen kann, was für Objekte tatsächlich in der list<> drin sind (er sieht nur den statischen Typ - und der ist Basis*).
-
sagen wir mal ich hätte ein eindeutiges musster von A's und B's in der LIST, dann eine lösung mit cast schon die geeigneste, wenn ich so sicher bin das ich immer weis wann ein A oder ein B kommt.?
-
zwei container mit jeweils A und B typen sind nicht geeignet? container von basisklassen halte ich grundsätzlich nur dann für sinnvoll, wenn der zugriff über das basisinterface an allen stellen ausreicht, sprich keine casts notwendig sind. gibt aber natürlich immer ausnahmen.
-
Habe eine Datenklasse welche die Basis- Klasse enthält, und zwei Managment klassen welche einmal die Klassen bspw. A und B verwenden und von mir aus C und D verwenden welche jeweils von Basis abgeleitet sind...
die Managmentklassen legen ihre Objekt A,B bzw. C,D in unterschiedlich defineriten muster an, aber verwenden trozdem die gleiche datenklasse..
also kommt man schwer drumherm mit mehren container zu arbeiten... quasie eine ausnahme...
-
Und was für eine Beziehung besteht überhaupt zwischen den beteiligten Klassen? (macht es da überhaupt Sinn, sie von einer gemeinsamen Basisklasse abzuleiten?)
-
ja, weil dennoch A,B,C,D variabeln enthalten die von allen adndere verwendet wird.
Zudem wir spätere ein Workflow klasse entwickelt welche dann die unterschiedlich generierten Datenklassen anhand der basisparameter verwendet..
-
Wenn du nur mit den (virtuellen) Methoden der Basisklasse auf die Daten zugreifen kannst/musst, kannst du die Basisklasse verwenden. Wenn du gezwungen bist, die Objekte als A oder B (oder was auch immer) zu verwenden, solltest du sie auch als A speichern, da ist so ein Cast nur fehleranfällig (irgendwann packst du ein Objekt in die list<>, das nicht zu dem vorgegebenen Anordnungsmuster passt - und dann fliegt dir dein PRogramm um die Ohren).
-
du meinst wenn ich die basis variabeln der basisklasse über virtualle methodne zugreifbar mach, ist theoritsch kein cast notwenig, weil dann über polymorphe gearbeiten werden kann...!?
-
Ja, so sieht's aus (wobei dann noch die Frage im Raum steht, ob A und B ähnlich genug sind, um über ein gemeinsames Interface angesprochen werden zu können).
-
BorisDieKlinge schrieb:
Habe eine Datenklasse welche die Basis- Klasse enthält, und zwei Managment klassen welche einmal die Klassen bspw. A und B verwenden und von mir aus C und D verwenden welche jeweils von Basis abgeleitet sind...
die Managmentklassen legen ihre Objekt A,B bzw. C,D in unterschiedlich defineriten muster an, aber verwenden trozdem die gleiche datenklasse.....

Sorry, kannst Du das mal kurz als Source skizzieren ?Gruß,
Simon2.
-
noch mal ne andere Frage:
A o; Basis *x= &o; A *p= static_cast<A*> (&(*x)); //geht A *p= static_cast<A*> &(*x)); //geht nichwieso?
-
Da fehlt 'ne Klammer, darum geht's nicht. (wobei man sich über den Sinn dieser Konstruktion streiten könnte)
-
sorry die rechte klammer müsste man noch weg machen..
nein ich meine das "&" auch eingeklammert werden muss damit es geht!!
-
Ja, bei den C++ Casts muss der gesamte betrachtete Ausdruck in Klammern gesetzt werden.
-
Was in sofern erklärbar ist, das es sich bei dem Cast um eine Funktion handelt...
cu André
-
ahh..... stimmt.. das erklärt alles