Den Klassennamen innerhalb einer Methode ermitteln



  • Hi,

    wie der Titel schon sagt würde ich gerne den Klassenname(und wenn möglich den Methodennamen) innerhalb meiner Eigenen Klasse ermitteln.

    Ich Stelle mir das in etwa so vor:

    void MyClass::MyFunktion(…)
    {
    	char buffer[256];
    	buffer=GetKlassenname(…);
    }
    

    Ist so etwas möglich und wenn ja wie?



  • Hallo

    Solche Funktionen bietet Standard-C++ soweit ich weiss nicht...
    Wie wäre es, wenn du uns verrätst, was du vorhast? (:



  • Ich schreibe derzeit ein größeres Programm und will Fehler die auftreten in eine Logdatei schreiben.
    Um schneller die Ursache zu ermitteln möchte ich daher den Ursprung ermitteln.

    Soweit ich weiß gibt es in Java solch eine Funktion und habe gehofft so etwas in C++ zu finden.

    Quasi(Log.txt):
    (Datum)(Zeit): Fehlerbeschreibung(z.B. Access Violation) in: Klassenname/Methodenname



  • Je nach Kompiler sind z.B. __LINE__ und __FILE__ Makros definiert, die die Zeilennummer und das zugehörige Source File angeben.

    Gänginge ASSERT Funktionen benutzte diese.

    Simon



  • Hallo

    Achso, verstehe. Nein, soetwas bietet C++ nicht. Würde auch garkeinen Sinn machen, da die Klassen zur Laufzeit des Programmes eh nicht mehr existieren.

    Aber ich frage mich, warum du nicht eben selber den Namen da reintippst, immerhin sind es ja dir bekannte Klassen, also sollte das doch kein Problem darstellen...

    Ansonsten informier dich hier weiter, da findest du einen Lösungsansatz, wie die Klassen nach dem kompilieren aussehen:
    http://www.openrce.org/articles/full_view/21

    Mfg.
    way



  • @theta:

    Danke funktioniert super.

    @way:

    Bisher hatte ich das auch immer so gemacht aber ich habe nach einer generischen Lösung gesucht. Daran das die Klassen sich „Auflösen“ hatte ich gar nicht mehr gedacht. Danke für den Hinweis 😉
    ---
    Der Thread kann geschlossen werden(kann man das hier selbst?).

    mfg Cyphron



  • Unter Microsoft Visual C++ kannst du das Makro __FUNCTION__ einsetzen, um an den Funktionsnamen zu gelangen. Allerdings ist das nicht sehr portabel, spezifischere Debug-Ausgaben wären wohl besser geeignet. Zum Beispiel hast du so immer noch Probleme bei Überladung.


  • Administrator

    Eine weitere Möglichkeit gäbe es noch, allerdings ist nicht garanatiert, was genau dabei rauskommt. Es soll laut Standard ein lesbarer Name sein, was das aber genau bedeutet ist eben nicht definiert 🙂

    // Allgemeine Version für this-Zeiger
    template<typename T>
    std::string get_class_name(T*)
    {
    	return typeid(T).name();
    }
    
    class Foo
    {
    public:
    	std::string get_class_name() const
    	{
    		return ::get_class_name(this);
    	}
    };
    
    int main()
    {
    	// Einfach die type_info holen von der Klasse.
    	// Wäre aber eigentlich ein "Foo" genausogut.
    	std::cout << typeid(Foo).name() << std::endl;
    
    	std::cout << Foo().get_class_name() << std::endl;
    
    	std::cin.get();
    
    	return 0;
    }
    

    Mit der ersten Version, also über this, kann man dann natürlich ein Makro machen:

    #define CLASS_NAME (::get_class_name(this))
    
    class Bar
    {
    public:
      void do_something()
      {
        std::cout << CLASS_NAME << std::endl;
      }
    };
    

    Viel mehr kann man in C++ halt nicht machen, da es keine Reflections gibt.

    Grüssli



  • Diese Lösung gefällt mir auch sehr gut. danke 🙂

    Aber ich denke ich werde mit __FILE__ und __LINE__ arbeiten. So kann ich noch
    herrausfinden wo der Fehler aufgetreten ist.

    Funktionniert übrigens auch mit dem g++ Kompiler unter Windows.
    Der Unterschied besteht nur darin das unter VC der gesamte Pfad+Datei und unter g++ nur die Datei angegben wird:

    VC: \...\...\datei.cpp
    g++: datei.cpp

    Ich werde es die Tage auch noch unter Linux und Mac OS testen.


Log in to reply