abgeleitete Klassen identifizieren
-
Wenn man Klassen
class Base {}; class Der1: public Base {}; class Der2: public Base;{} Der1 d1; Der2 d2; std::vector<Base*> vBase; vBase.push_back(&d1); vBase.push_back(&d2);benutzt, wie kann man herausfinden, ob ein Iterator auf vBase gerade auf Der1 oder Der2 zeigt?
Ich koennte natuerlich eine virtuelle "Identifikationsfunktion" bereitstellen, doch das scheint mir unelegant. Gibt es eine andere Moeglichkeit?Tim
-
Wenn Du das herausfinden musst, stimmt meist was mit dem Design nicht. Die Abstraktion über Base macht man i.d.R gerade weil es egal ist ob man ein Der1 oder Der2 hat, sie sind austauschbar.
Wenn man doch eine Unterscheidung braucht, bietet sich das Vistor Pattern an, das aber meistens doch nicht sehr elegant ist (es sei denn die Base Hierachie wird eigentlich nie erwietert und es kommen nur neue Funktionen dazu).
Oder eine dumpfe Type switche mit dynamic_cast.
-
Ich wuerde gerne herausfinden, wie ich das, was ich vorhabe, besser realisieren sollte. Das Gefuehl, dass es nicht ganz ideal ist, hatte ich auch schon.
Ich habe zwei Klassen, A und B, von denen ich jeweils einen std::vector<A> und std::vector<B> habe.
Jetzt moechte ich die beste Kette (a1,b1,a2,b2,a3,b3,...) finden. Fuer die Bestimmung von "gut" kann ich einen Wert berechnen, muss dafuer allerdings wissen, ob die Kette mit einer Klasse Typ A oder Typ B beginnt. Ich weiss dafuer bestimmt, dass Klasse A und Klasse B sich immer abwechseln.Um ueberhaupt diese heterogene Kette speichern und weiterverarbeiten zu koennen, wollte ich eben eine Basis-Klasse Base anlegen und zwei Derivate DerA und DerB, die jeweils Zeiger auf Klasse A bzw. B enthalten (und vielleicht weitere Informationen, wie z.B., dass a1 bereits benutzt ist, damit es kein zweites Mal in der Kette vorkommt).
Die Klassen A und B sind allerdings in der Tat recht unterschiedlich.
Ich hoffe, diese Beschreibung reicht bereits fuer eine erhellende Kritik. Ist es z.B. besser, zwei parallele Vektoren je aus A und B zu haben - da sich A und B in der Kette immer abwechseln, waere das prinzipiell machbar. Ich waere auch ueber Literaturhinweise dankbar.
-
Kannst Du die Berechnungsfunktion nicht in die Subklassen packen und polymorph aufrufen?
-
Was ist denn das Problem mit std::vector<A> und std::vector<B>?
-
brotbernd schrieb:
Was ist denn das Problem mit std::vector<A> und std::vector<B>?
Ich habe kein Problem damit, ich bin nur nicht erfahren genug um zu wissen, was fuer ein solches Konzept die sauberste Implementierung ist, und bin deswegen fuer Ratschlaege und Kommentare sehr dankbar. Habe auch schon mit einer Klasse begonnen, die die beiden vectoren vereinbart.
-
was Du suchst ist wahrscheinlich der dynamic_cast
class Base{};
class A:public Base{};
class B:public Base{};Base* tmp = new A();
if ( dynamic_cast<A*>(tmp) != NULL )
{
/// es handelt sich um ein Object von Type A
}