Polymorphie Problem
-
Hey,
ich habe zwei Klassen A und B welche beide von der abstrakten Klasse C erben.
Zusätzlich habe ich einen Vektor in dem sich Elemente vom Typ C* befinden. Nun soll ich die Anzahl der A's und B's in dem Vektor zählen.Wie kann man das machen? Ich dachte jetzt an Methoden wie isA() oder isB() in der C Klasse. Aber das ist ja nicht wirklich Sinn der Sache. Wie kann ich das machen unter "Ausnutzen" der Polymorphie?
-
Warum willst du das machen? Das könnte an sich schon ein Designfehler sein. Wenn du eine Liste von C hast, sollte es optimalerweise keinen Grund geben zu wissen, wieviele Objekte davon A oder B sind.
-
Ich kann mir einige Beispiele überlegen, wo das notwendig ist - Beispiel: Liste von C-Pointern, Elemente der Klasse A kommen nicht mehr hinzu, Elemente der Klasse B schon, und für die A-Elemente soll ein zusammenhängender Speicherblock reserviert werden, in dem dann irgendwas geschrieben wird. Und das ist nur der erste, der mir einfällt.
Stichwort ist
dynamic_cast(Prüft, ob Basis-Pointer in Ableitungs-Pointer umgewandelt werden kann). Wenn bei dem kein NULL-Pointer rauskommt, dann ist der C-Pointer ein valider Pointer von A oder B.Allerdings sei gesagt, dass hierfür Run-Time Type Information (kurz: RTTI) zur Verfügung stehen müssen, sonst geht das nicht. Sprich, du musst darauf achten, dass diese vom Compiler generiert werden. Und es ist ein wenig langsam, habe ich zumindest noch so gelernt. Und unschön soll es auch sein, aber da ich hauptsächlich nicht C++ mache, weiß ich das auch nur aus externer Quelle.
Ohne mehr über das, was du versuchst, zu wissen, können wir allerdings auch nicht mehr sagen.
-
dachschaden_off schrieb:
Ich kann mir einige Beispiele überlegen, wo das notwendig ist
Natürlich kann ich mir da auch paar Beispiele vorstellen. Aber zuerst muss man klären, ob es sich um so einen Fall handelt, bevor jemand Anti-Pattern verinnerlicht.
-
Die Objekte der Klassen A/B beeinflussen sich gegenseitig durch ihren Typ und mein gewünschter Weg ist der einzig mögliche (leider). Auch wenn es schwer ist: Ich bitte darum das einfach mal so hinzunehmen.
dynamic_cast wollte ich wirklich vermeiden, was gäbe es sonst noch so für Möglichkeiten?
-
Außer dynamic_cast könntest du höchstens noch das Visitor Pattern probieren.
-
-
polyfrage123 schrieb:
Die Objekte der Klassen A/B beeinflussen sich gegenseitig durch ihren Typ und mein gewünschter Weg ist der einzig mögliche (leider). Auch wenn es schwer ist: Ich bitte darum das einfach mal so hinzunehmen.
dynamic_cast wollte ich wirklich vermeiden, was gäbe es sonst noch so für Möglichkeiten?
Du kannst ja mal konkret beschreiben, was du willst. Vielleicht hat ja wer eine Idee, wie du das Problem am besten löst.
-
dachschaden_off schrieb:
Ich kann mir einige Beispiele überlegen, wo das notwendig ist - Beispiel: Liste von C-Pointern, Elemente der Klasse A kommen nicht mehr hinzu, Elemente der Klasse B schon, und für die A-Elemente soll ein zusammenhängender Speicherblock reserviert werden, in dem dann irgendwas geschrieben wird.
Dann solltest du einfach in der Basisklasse zwei Funktionen haben, z.b. GetMemoryNeeded und WriteMemoryblock, die dort als return 0 und nop definiert sind. Das ganze in A dann entsprechend ueberladen.