Reflection: ClassOfCaller gesucht
-
Ich glaube das Problem ist hiermit ausreichend beschrieben.

schon mal dank im vor raus - gorgoyle
-
Also... In irgendeinem Java vs. C++ Flame-Thread kam irgendwann mal das Thema Reflection auf und ichwusste nicht was das genau war.
Deshalb habe ich dann gefragt und als Antwort (unter anderem) gekriegt, dass es in C++ (praktisch) kein Reflection (außer RTTI) gibt.
Entweder falsches Forum oder: Es geht nicht :pFelix
-
Beschreibe mal, wofür du das brauchst.
-
Ich möchte ohne zusätzlichen Parameter in einer Instanz-Methode M eine Print-Methode P aufrufen. P soll erst als "Label" den Namen der Klasse von M ausgeben und danach die von M erhalte Nachricht.
Wenn M zu P nicht extra sagt, zu welcher Klasse M gehört, muss P das irgendwie selbst herauskriegen.Unter Java nennt sich das reflection. Gibt es sowas nicht auch unter C++?
-
Hä?
Ich nichs verstehen, was du wollen.Also, erstmal, Reflection gibts in C++ nicht. Es gibt zwar RTTI (Runtime Type Informations), aber die sind so mager, das sie gerade mal dazu beitragen, das ein C++-Programm überhaupt läuft. Denn in C++ gilt die Devise: du bezahlst nur für das, was du auch willst. Und Reflections will niemand.
Denn Reflections heißt auch Performance-Verlust. Willst du Reflections in C++ haben, mußt du C++/CLI benutzen (aber das willst du bestimmt auch nicht).Egal... zurück zu deiner Frage: ich habe mir jetzt mehrmals deine Beschreibung durch gelesen. Mich beschleicht das Gefühl, das es nichts mit Reflections zu tun hat, sondern mit Objektorientierung und somit Polymorphie. Und Polymorphie bekommst du in C++ hin, in dem du das Schlüsselwort virtual für deine Methoden benutzt. Das ist Basis-Technik in C++, also keine Trickserei.
Aber wie gesagt, verstanden habe ich dein Problem nicht 100%ig. Ich habe mal bei Google "classofcaller" eingegeben: 1 (EIN!) Ergebnis. Also, irgendwie hast du wohl den falschen Begriff genutzt, um uns dein Problem zu schildern.
-
gorgoyle schrieb:
Ich möchte ohne zusätzlichen Parameter in einer Instanz-Methode M eine Print-Methode P aufrufen. P soll erst als "Label" den Namen der Klasse von M ausgeben und danach die von M erhalte Nachricht.
Wenn M zu P nicht extra sagt, zu welcher Klasse M gehört, muss P das irgendwie selbst herauskriegen....class PrintableClassName { protected: virtual void P() const = 0; }; class A : public PrintableClassName { protected: virtual void P() const { cout << "A"; } }; class DoSomethingWithA { A a; public: void M() const { a.P(); } }; class DoSomethingWithAnyPrintableClassName { PrintableClassName* a; public: DoSomethingWithAnyPrintableClassName(PrintableClassName* anyPCN) : a(anyPCN) {} void M() const { a->P(); } };Irgendwie brauche ich da gar keine "Reflections" ... und irgendwie kann ich gar nicht glauben, dass man in Java welche zur Lösung dieser Aufgabe bräuchte.
Gruß,
Simon2.
-
Simon2 schrieb:
Irgendwie brauche ich da gar keine "Reflections" ...
Du hast ja auch nicht die Klasse, in der M steht, ausgegeben, sondern die, in der P steht. Um das hinzukriegen, müsste man auf den Aufrufstack gucken und den this-Parameter der obersten Methode nach seinen Typinfos fragen.
Mag in Java gehen, in C++ -- keine Chance.
-
Bashar schrieb:
Simon2 schrieb:
Irgendwie brauche ich da gar keine "Reflections" ...
Du hast ja auch nicht die Klasse, in der M steht, ausgegeben, sondern die, in der P steht. Um das hinzukriegen, müsste man auf den Aufrufstack gucken und den this-Parameter der obersten Methode nach seinen Typinfos fragen.
Mag in Java gehen, in C++ -- keine Chance.Ahaaaa !

D.h. er möchte den Namen einer Klasse ausgeben, die das "von sich aus nicht kann" ?
Naja, "statisch" ginge das noch mit templates, aber "dynamisch" sehe ich da auch keine Lösung. .... allerdings auch kein (echtes) Anwendungsgebiet...(höchstens zu Debuggingzwecken).Gruß,
Simon2.
-
Also will er, das der Klassenname des Aufrufers einer Methode ausgegeben wird? Welchen Sinn soll das haben? Und wenn man das unbedingt haben will/muß, dann muß man sich halt this übergeben lassen. Ich weiß, muß sich die Schnittstelle ändern/anpassen. Aber das wäre dann ohne Trickserei, sondern sauber. Reflections sind eine tolle Sache, aber kann man meistens durch entsprechendes Design "umgehen".
-
Die Antwort, daß es keine Reflection unter C++ gibt, ist erschöpfend aber nicht befriedigend

Zunächst der MethodenName classOfCaller() war griffig und kurz, aber nur erfunden, um die Lösung zu skizzieren.Für den Interessierten:
Ich wollte auf Kosten der Performance zu gunsten der Quellcode-Größe darauf verzichten jeder betroffenen Klasse beizubringen, wie man den Klassennamen in die auszugebende Nachricht vorsetzt, sondern diese Fähigkeit nur in der Klasse implementieren, die für Ausgaben zuständig ist.Class A { IONode IO; void check() { IO->D("okidoki!"); } }; /** classOfCaller() gibt es leider nicht :( */ Class IONode { void D (char*ca) { cout << "Klasse " << [i]classOfCaller()[/i] << " meldet: " << ca <<'\n'; } };Dies Problem lässt sich zwar noch umschiffen, wenn ich zusätzlich noch eine Methode L(char*ca) (L für Label)schreibe, aber wenn ich die Ausgabe umleiten oder blocken möchte, muß Klasse IONode schon wissen, von wem die Nachricht kommt.
Ich muß da wohl noch etwas basteln..
-
Umleiten oder blocken? Was willst du eigentlich erreichen? Ich wette mit dir, das man dein "Problem" mit normalen C++-Mitteln lösen kann. Wenn du nicht andauernd auf dem Java-Zug hängen würdest, sondern mal aussteigen und uns auf dem Bahnsteig dein allgemeines Problem und Ziel erklärst, ohne Java-Gedanken.