Typ eines Objektes ermitteln



  • Hi,

    ich habe eine Klasse die mehrere Klassen ableitet und nun habe ich eine Instanz der Elternklasse und möchte gerne wissen ob sie evtl. mit dem Konstruktor einer der abgeleiteten Klassen erzeugt wurde bzw. von welcher abgeleiteten Klasse ihr Typ ist.

    In C# bieten alle Klassen die GetType() Methode um entsprechende Informationen zu einem Objekt abrufen oder man kann mit dem as-Operator herausfinden ob sich ein Objekt zu einem bestimmten Typen (in dem Fall zu einer der ablgeleiteten Klassen) casten lässt. Gibt es auch in unmanaged C++ entsprechende Möglichkeiten?

    Gruß
    schrankwand



  • Ja, du kannst mit typeid(obj) eine typeinfo zu deinem Objekt beschaffen. Und du kannst mit dynamic_cast<> versuchen, dein Objekt in den gewünschten Typ zu casten (das liefert NULL zurück, wenn's nicht klappt).



  • typeid und typeinfo funzen aber nur mit eingeschalteten RTTI (compiler optionen)
    darauf achten ...

    generell: den Typ eines Objects zur Laufzeit bestimmen zu wollen, bzw die frage danach, deutet meist auf schlechtes Design hin, "normal" braucht man sowas nicht !

    Ciao ...



  • Da will ich garnicht wiedersprechen, aber wenn man nicht alles from the scratch macht, sondern auf Klassenbibliotheken zurückgreift kann man meist für das Design dieser nichts.

    In meinem konkreten Fall geht es um die taglib (http://developer.kde.org/~wheeler/taglib.html), wo die Klasse TagLib::Tag, die Klassen TagLib::APE::Tag, TagLib::ID3v1::Tag, TagLib::ID3v2::Tag, TagLib::Ogg::XiphComment ableitet und es keine andere Möglichkeit gibt, herauszufinden um welche Art Tag es sich genau handelt.



  • Also typeid würde ich nicht benutzen, da das Ergebnis Compilerabhängig ist. Also selbst unter Windows, bekommst du höchstwahrscheinlich von MinGW und MSVC unterschiedliche Ergebnisse.

    Benutze dynamic_cast, das ist am sichersten.



  • schrankwand schrieb:

    ... ableitet und es keine andere Möglichkeit gibt, herauszufinden um welche Art Tag es sich genau handelt.

    Hi,

    klar, man "hängt" bisweilen am fremden/schlechten Design - da muß man oft Dinge tun, für die man sich sonst schämen würden ... 😉
    Aber im konkreten Fall würde ich mich fragen: Wieso bietet die Lib keine Möglichkeit, die "TagArt" herauszufinden ? Offensichtlich ist sie nicht dafür geschrieben bzw. es ist nicht vorgesehen. Wenn Du Pech hast, erreichst Du mit Deiner "Abfrage" gar nicht (oder schlimmer noch: Nur unzuverlässig) das von Dir Gewünschte. Ich kann mir nicht vorstellen, dass vor Dir noch niemand herausfinden wollte, "um welche Art Tag es sich genau handelt" - und wenn doch: Überleg mal, warum. 😉

    Vielleicht hast Du das alles schon hinter Dir und weißt genau, was Du tust (und dass Du das mit diesen Mitteln erreichst)... dann vergiß, was ich sagte.
    Aber weil es auch anders sein könnte (man kennt sich hier ja oft noch nicht so lange), rate ich Dir dazu, da nochmal genau in Dich zu gehen.

    Gruß,

    Simon2.



  • Benutze dynamic_cast, das ist am sichersten.

    relativ ^^ weiss nicht ob die taglib mit RTTI uebersetzt worden ist, wenn nich musst die neu compileiren ....

    sondern auf Klassenbibliotheken zurückgreift kann man meist für das Design dieser nichts.

    richtig, aber :

    aus der taglib doku

    A generic, simple API for the most common tagging related functions.

    Auf den ersten blick (hab mich ned intensiv damit beschaeftigt) will der autor der bib Dir nen einheitliches Interface fuer die Tags zur verfuegung stellen, ohne dass du wissen musst (sollst) was denn genau da drunter liegt.

    Wenn du aber unterschiede machen willst (oder warum willst du wissen welche klasse drunter liegt, damit hasst du ja die Info ueber das "Format") arbeitest du genau gegen das Ziel, was der autor eigentlich erreichen will. Brauchst dich also ned wundern wenn du da auf " widerstand" stoesst ^^

    Was genau willst du machen, bzw aendern ?

    und genau einen wichtigen Hinweis gibt dir der autor noch :

    Make the tagging framework extensible by library users; i.e. it will be possible for libarary users to implement additional ID3v2 frames, without modifying the TagLib source (through the use of Abstract Factories and such.

    willst du was am verhalten aendern, sollst das durch ne eigenimplementation machen ^^

    Ciao ...



  • Momentan experimentier ich nur ein wenig mit der API rum. Aber das einheitlich Interface mittels TagLib::Tag ermöglicht nur Zugriff auf Attribute die alle Tag-Formate unbterstützen Titel, Interpret, Album, Genre, Erscheinungsjahr, Tracknummer und Kommentar. Aber was ist wenn man Tag-spezifische Features nutzen möchte?



  • elativ ^^ weiss nicht ob die taglib mit RTTI uebersetzt worden ist, wenn nich musst die neu compileiren ....

    Wenn diese Lib nicht mit RTTI kompiliert wurde, ist es auch kein sauberes C++.



  • Dann hab ich nirgends sauberes c++ , weil bei meinem compiler iss RTTI per default aus ^^
    und ich schalts nur ein wenn ichs wirklich brauch

    Ciao ...


Anmelden zum Antworten