Prüfen ob eine Classe einen bestimmten Member hat (Laufzeit)
-
Hallo,
ich würde gerne wissen, wie ich werend der Laufzeit Prüfen kann, ob eine Classe einen bestimmten Member, bzw. Memberfunktion hat, aka:
class base { public: void funktion(); }; class klasse : public base { public: int nichts; }; klasse *test = new klasse; if ( ???? test->neue_funktion ???? ) test->neue_funktion(); else test->funktion(); delete test;Ich weiß das es geht, ich habe das vor langem mal gemacht, kp mehr wie.
Um genauer zu sein, wird ein Zeiger in die WindowsProcedur mit übergeben, dieser via dynamic_cast auf die base Klasse gecasted, dann wird überprüft, ob die Klasse einen Member Namens (zB) void OnMouseMoveOver() besitzt, wenn ja, aufrufen.
Danke im V-sterne-oraus
-
Hallo
MalFragen schrieb:
V-sterne-oraus
Hää

chrische
-
wenn man v o r a u s normal schreibt wird es durch * ersetzt.
also: schon mal danke im ******.
-
DrakoXP schrieb:
wenn man v o r a u s normal schreibt wird es durch * ersetzt.
also: schon mal danke im ******.Nö, wenn man es falsch schreibt, kommen Sterne, da viele meinen, das man es mit 2 R Schreibt.
Aber das ist jetzt auch egal, war ja nur nen Gimick, also bitte back to Topic.
-
Hallo
DrakoXP schrieb:
wenn man v o r a u s normal schreibt wird es durch * ersetzt.
also: schon mal danke im ******.Da fällt einem nichts mehr ein.

chrische
-
Hi, mir fällt keine Möglichkeit ein um sowas zu testen, außer das ne abgeleitete Klasse diese Memberfunktion hat und du prüfst ob dein Basisklassenzeiger auf ein abgeleitetes Objekt zeigt ...
Trotzdem ist es ziemlich unsauber/unschön/blub dein Vorhaben in nem Design zu haben, da gibts bestimmt ne andere Möglichkeit um dein Vorhaben(?) zu erreichen ...
-
C++ kennt keine Reflections, also ist es sinnlos.
-
Das ist zwar nicht das wonach du gefragt hast, dafür aber ziemlich sicher das was du suchst:
class base { public: virtual void funktion() { printf("base\n"); } }; class klasse1 : public base { public: virtual void funktion() { printf("klasse1\n"); } // eigene "funktion" }; class klasse2 : public base {}; // verwendet base::funktionWenn du was anderes suchst drück dich genauer aus, da das, was du beschreibst, in C++ nicht möglich ist.
-
Du könntest höchstens deiner Basisklasse alle mit Funktionszeigern ausstatten (entweder ein Array von FUnktionszeigern oder ein paar einzelne, also ungefähr so:
typedef void (*procPointer)(void); class Base { public: //Statt jeden Pointer einzeln zu schreiben, könnte man auch ein Array verwenden... procPointer OnMouseMoveOver; procPointer OnKlick; Base() : OnMouseMoveOver(0), OnKlick(0) {} }; int main() { Base *test = new Base; //Setze den Zeiger oder auch nicht... if(test->OnKlick) { test->OnKlick(); } return 0; }Irgendwie so. Dann wäre es halt nicht von der speziellen Klasse, sondern von jeder Instanz abhängig, ob die bestimmte Methode implementiert ist oder nicht... Kann sein, dass dir das hilft, wenn nicht glaube ich auch, dass das was du möchtest in C++ nicht wirklich geht.
Felix
-
COM unterstutzt sowas, zumindes COM Objecte die IDispatch unterstuetzen, weil genau dafuer ist es da, zur laufzeit die funktionen die ein Object unterstuetzt, aufzuloesen. C++ ist aber eine typisierte Sprache, d.h. der compiler checkt ob es ne funktion gibt, und keine runtime engine.
Also entweder verwendest Mechanismen die dazu gebaut sind (COM Corba), oder entwickelst was eigenes.
Brauchen tut man das schon ansatzweisse, meist im Zusammenhang mit plugins. In C++ geht man meistens aber nicht auf Funktionsebene runter, sondern fasst funktionalitaet zu schnittstellen zusammen, und checkt, ob das Object ne Schnittstelle unterstuetzt (muss man selber bauen).
Meist benutzt man da ne allgemeine Plugin Schnittstelle, die man mit dem Namen der gesuchten Schnittstelle fuettert, und die einem dann nen (untypisierten) zeiger oder null zurueckgibt, je nachdem ob unterstuetzung da ist oder nicht.Ciao ...
-
doppel Post ....