Klassen: Who is your dady?



  • Hi,

    ich habe folgendes Problem: Um Klassen eindeutig identifizieren zu können, benutze ich deren Klassenname.

    Dafür benutz ich ne ganz popelige Funktion:

    class Z : public Y //  class Y : public X
    {
    public:
        // ...
        string getName ()
        {
            static string name = typeid(*this).name();
            return (name);
        }
        // ...
    };
    

    Problem hierbei ist jedoch, das der Parent nicht berücksichtigt wird - welchen ich jedoch auch wissen muss!

    Was ich mir wünschen würde wäre z. B. wenn ich getName von Z aufrufe folgenden String zu bekommen:
    "Z:Y:X"

    oder wenn ich von X aufrufe:
    "X"

    bzw. bei Y:
    "Y:X"

    Leider gibt es nicht wie in C#, Java oder PHP die möglichkeit "parent", dank der eigentlich nützlichen Mehrfachvererbungsunterstützung.

    Weiß jemand wie ich das Problem lösen kann?



  • C++'ler schrieb:

    Weiß jemand wie ich das Problem lösen kann?

    Verwende ein Design, bei dem du solche Informationen nicht benötigst. Wenn das nicht geht, verwende nicht C++.

    In C++ geht das nicht wirklich, darum schreibt man Programme üblicherweise so, dass sie ohne solche Informationen auskommen. Das Verwenden von zur Laufzeit ermittelten Typinformationen wird IMHO verbreitet als Indiz für schlechtes Design angesehen.



  • die sinnvollste lösung für das problem hängt jetzt stark davon ab, was genau du eigentlich machen willst oder anders: wofür brauchst du die genau identifikation deiner klasse?



  • Beim Entwickeln der Klassen weißt du doch, wie sie miteinander verwandt sind - und dann kannst du auch genau das als Typ angeben, was du benötigst:

    class Z : public Y
    {
      string GetName()
      {
        static string name = string(typeid(*this).name())+":"+Y::GetName();
        return name;
      }
    };
    


  • @MFK:
    Falsch, ich benutze es zur Initialisierungszeit, daher static. Außerdem bietet C++ kein Konstante __CLASS__. Also erzähl mir bitte nichts vom schlechten Design - zur Initialisierungszeit ist das Furz wie Deckel.

    @ghost:
    Ne Art Double Dispatcher, soll das werden, der alle Interaktionen verwaltet. Wenn jedoch keine Interaktion zu einer Klasse existiert, soll die Interaktion der darüberliegenden (also der Vater-Klasse) genommen werden. Mehrfachvererbung wird nicht benötigt.

    Funktionieren tuts das gut wenn ich den Klassennamen per Hand einpflege, jedoch automatisiert ist das alles besser.

    Ich dachte auch evtl. daran Integer zu benutzen, jedoch habe ich dort das selbe Problem nur in Grün.



  • Im Magazin gibts einen Artikel zum Double-Dispatchen. Recht schwierig zu verstehen wie ich finde, aber ein Blick wert 🙂



  • Zum Thema double dispatcher koennte dir vielleicht das Kapitel "Multimethods" aus Alexanderescus "Modern C++" helfen. Da sind verschiedene Ansaetze Beschrieben, wie man so ein problem angehen kann.



  • Wie ist das eigentlich? Da geht es doch darum, dass aufgrund von zwei (oder mehr) Typeninformationen die entsprechende Funktion aufgerufen wird, oder?



  • Badestrand schrieb:

    Wie ist das eigentlich? Da geht es doch darum, dass aufgrund von zwei (oder mehr) Typeninformationen die entsprechende Funktion aufgerufen wird, oder?

    Jap. Im weitesten Sinne also das, was virtuelle Funktionen in Abhaengigkeit von einer Klasse koennen.



  • Badestrand schrieb:

    Im Magazin gibts einen Artikel zum Double-Dispatchen. Recht schwierig zu verstehen wie ich finde, aber ein Blick wert 🙂

    hab mir das angeguckt, aber wenn man mehr als nur einmal ließt: "Das ist trivial", "wie jedem klar ist geht das nicht" (und keine richtige Lösung kommt) usw. hat man schon die Lust dran verloren und macht es selbst.

    Ist zwar schön und gut das es diesen Artikel geht, aber am Ende kommt nichts richtig lauffähiges bei rum und es stehen mehr Fragen im Raum als Antworten.

    @pumuckl
    hab leider nicht soviel geld 😞


Anmelden zum Antworten