Typ eines pointees bestimmen [gelöst]



  • Hi!

    (Noch) eine kurze Frage: Was ist die "beste", bzw. sicherste Art,den Typ des pointees eines "polymorphen" Zeigers (sagt man das so?) herauszufinden?

    So:

    if(typeid(*Zeiger) == typeid(Klassenname))
    

    oder

    if(dynamic_cast<Klassenname*>(Zeiger))
    

    oder sonst noch was... vielleicht ein Member-Enum, dass alle implementieren Kinder auflistet?

    MfG + VDiVR



  • Die beste Lösung ist, das Design zu fixen sodass der downcast nichtmehr nötig ist 😉



  • Ja, wofür brauchst Du das denn?

    Variante 2 ist besser, weil Du da einer begründeten Vermutung nachgehst, während Du bei Variante 1 ins blaue schießt. Variante 3 benötigt einen sehr speziellen Kontext, um Sinn zu ergeben.



  • Ich seh das genau andersherum als Eisflamme. dynamic_cast kann sehr kostspielig sein, wenn Mehrfach- und virtuelle Vererbung ins Spiel kommen; typeid dagegen muss nur kurz in die virtuelle Funktionstabelle kucken und braucht sich nicht darum zu kümmern, wo welche Unterobjekte anfangen bzw. durch was für einen Zeiger man gerade auf das Objekt zugreift.

    Dessen ungeachtet ist das Vorhaben aber natürlich ein Zeichen für schlechtes Design, das zu geeigneter Zeit überarbeitet werden sollte.



  • seldon schrieb:

    Dessen ungeachtet ist das Vorhaben aber natürlich ein Zeichen für schlechtes Design, das zu geeigneter Zeit überarbeitet werden sollte.

    Wobei die geeignete Zeit "sofort" ist.



  • Diese Einstellung ist zwar nobel, aber nicht sonderlich pragmatisch. Wenn ich mich in einer Situation befinde, in der der Kram möglichst bis gestern wieder laufen muss, ein notwendiges Redesign einige Zeit in Anspruch nähme und ein dreckiger Hack wie dieser erstmal funktioniert, lasse ich nicht sofort alles stehen und liegen, um das Modell zu fixen. Stattdessen schreibe ich es mir in den Bugtracker und fange damit an, nachdem ich das bisherige notdürftig geflickt habe.

    Das mit dem Bugtracker ist dabei wichtig, sonst wird aus so einem Provisorium mitunter eine Dauereinrichtung, derentwegen man sich immer wieder in den Arsch beißt.



  • Also, nur um es klar zu stellen: Ich weiß sehr wohl, dass die bloße Nötigkeit dieser Sache bereits auf unschönes Design hinweist (ich brauche es ja auch nicht). Ich wollte einfach wissen, wie man es (wenn mans mal braucht) am besten macht (Variante 1 bevorzuge Ich).

    Also vielen Dank an alle. 🕶



  • Ist ja nicht so, dass beide Varianten dasselbe tun, vielmehr hängt die Entscheidung von der konkreten Problemstellung ab. Grundsätzlich willst du ja nicht "Typen herausfinden", sondern irgendwas damit erreichen. Du kannst mit den beiden Schlüsselwörtern ohnehin nur Typen auf Gleichheit ( typeid ) oder Vererbungsrelation ( dynamic_cast ) prüfen.

    Generell sind virtuelle Funktionen zu bevorzugen, in den meisten Situationen erreicht man mit ihnen das Gleiche auf eine elegantere Art und Weise.


Anmelden zum Antworten