Umgehung von RTTI: "Elegantere" Lösung?



  • Hi,

    in meinen Programmen leitet jede Klasse von der Klasse "object" ab. Da ich schon mal zur Laufzeit wissen muss, welche Klasse jetzt welche ist, benutze ich typeid. Das ist natürlich ordentlich langsam und "unschön", vorallem wenn ich nur den Namen der Klasse brauche.

    Jetzt hab ich folgendes probiert, was auch wunderbar funktioniert - jedoch finde ich diesen Lösungsansatz nicht sehr elegant.

    #include <iostream>
    #include <string>
    
    class object
    {
    public:  
        virtual std::string get_class_name (void) const
        {
            static std::string value = std::string (__FUNCTION__).substr (0, std::string (__FUNCTION__).find_first_of (":"));
            return value;
        }
    };
    
    class object_a : public object
    {
        virtual std::string get_class_name (void) const
        {
            static std::string value = std::string (__FUNCTION__).substr (0, std::string (__FUNCTION__).find_first_of (":"));
            return value;
        }
    };
    
    int main (void)
    {
        object obj;
        std::cout << obj.get_class_name () << std::endl; // Ausgabe: object
    
        object_a obj_a;
        std::cout << obj_a.get_class_name () << std::endl; // Ausgabe: object_a
    
        return 0;
    }
    

    Es ist doof das ich exakt den selben Code in jeder Klasse habe.

    Daher meine Frage: kennt wer einen schöneren Lösungsansatz?

    Viele liebe Grüße.

    p.s.: Bitte keine Diskussion wofür man sowas braucht.



  • C++'ler schrieb:

    p.s.: Bitte keine Diskussion wofür man sowas braucht.

    Eben die wäre nötig um ggf. besser Vorschläge machen zu können...



  • Ich wüsste nicht, was so eine diskussion noch bringen sollte.



  • Wenn du eine Lösung für ein Problem suchst, solltest du erst mal das Problem beschreiben und nicht deine Lösung, dann kann man dir auch ne andere Lösung sagen. So weiß doch kein Mensch was da rauskommen soll.


  • Administrator

    C++'ler schrieb:

    Ich wüsste nicht, was so eine diskussion noch bringen sollte.

    Ein besseres Design und Aufbau der Klassenhierarchie.
    Ich habe noch nie erlebt, dass alle meine Klassen von einer einzigen Basisklasse geerbt haben. Das ist meistens eher ein Designfehler und es wird einem auch wunderbar dadurch gezeigt, dass du gerade eine Sache irgendwie durchfrickeln willst.
    Es darf eigentlich nie vorkommen, dass man eine Basisklasse hat und man dann herausfinden muss, welche abgeleitete Klasse es nun genau ist. Deshalb gilt auch die Verwendung des dynamic_cast s als ein Designfehler, bzw. dessen Verwendung sollte eher sehr selten sein.

    Grüssli



  • @ Dravere
    Ich kann kein 8 Jahre altes Programm so einfach umschreiben das auf >500 Kundenrechnern läuft! Ich benötige nur den Klassennamen zur Laufzeit



  • @mods:
    könnt topic schließen, hab was gefunden. wenn es nach einigen hier geht dürfte man nicht z. B. mal einen double dispatcher implementieren. frechheit



  • C++'ler schrieb:

    wenn es nach einigen hier geht dürfte man nicht z. B. mal einen double dispatcher implementieren. frechheit

    😃

    Du hättest gleich sagen sollen, dass es um's Modifizieren von einer größeren Software geht 🙂 Dein Anfangs-Beitrag sah wohl nicht nur für mich so aus, als würdest du ein neues Projekt planen.
    Darf man denn aus Neugierde (und ohne Diskussion meinerseits, versprochen) fragen, wofür genau du die Klassennamen brauchst?



  • @ Badestrand
    Für System-Logging (ich kann nicht zum Debuggen 500km weit fahren, wenn was nicht geht), Reflektion, die GUI, Konfiguration der Anwendung - was in der Datenbank gesichert wird, uvm.



  • Dravere schrieb:

    C++'ler schrieb:

    Ich wüsste nicht, was so eine diskussion noch bringen sollte.

    Ein besseres Design und Aufbau der Klassenhierarchie.
    Ich habe noch nie erlebt, dass alle meine Klassen von einer einzigen Basisklasse geerbt haben. Das ist meistens eher ein Designfehler und es wird einem auch wunderbar dadurch gezeigt, dass du gerade eine Sache irgendwie durchfrickeln willst.
    Es darf eigentlich nie vorkommen, dass man eine Basisklasse hat und man dann herausfinden muss, welche abgeleitete Klasse es nun genau ist. Deshalb gilt auch die Verwendung des dynamic_cast s als ein Designfehler, bzw. dessen Verwendung sollte eher sehr selten sein.

    Grüssli

    Ja, genau Java ist ein großer Designfehler *flame* XD



  • @Zeus:
    Jo, C#, Smalltalk, PHP, Ruby und co. und alle Sprachen die Reflection unterstützten sind ein Designfehler.



  • C++'ler schrieb:

    @mods:
    könnt topic schließen, hab was gefunden. (...)

    Fände es nett wenn du posten würdest WAS du gefunden hast.

    BTW: gegen double-dispatch wird wohl kaum ein vernünftiger Designer/Programmierer was haben 🙂


Anmelden zum Antworten