Zeiger auf Methoden einer unbekannten Klasse



  • Hy
    Ich brauch eine Klasse in der ich in einem Vector o.ä. Zeiger auf Methoden und auf ein Objekt einer unbekannten Klasse speichern kann und diese dann auch abrufen. Mein Ansatz war :

    template<class Class>
    void Add(Class* Object, (void)(Class::*Callback)(void) );
    

    Dann könnte ich die "Add" Funktion in der Theory etwa so benutzen :

    <MyClass>Add(*MyObject, &(MyObject::MyMethod));
    

    Wobei "MyMethod" weder Parameter noch einen Rückgabetyp haben darf.

    Aber so gehts nicht, gibt 23 Fehler von Fatal error C1004: Underwartetes Dateiende, bis error c2988: Unerkannte Vorlagendeklaration/-definiotn ist da alles dabei.

    Ich hoffe ihr könnt mir Helfen.
    MfG Nusso



  • Nusso schrieb:

    Dann könnte ich die "Add" Funktion in der Theory etwa so benutzen :

    <MyClass>Add(*MyObject, &(MyObject::MyMethod));
    

    Definitiv nicht, Templates haben eine andere Syntax. 😉
    Ausserdem scheint mir, zur Funktionssignatur würde eher ein Adress- als ein Dereferenzierungsoperator passen.

    Du solltest dich ein wenig in die Materie einlesen, bevor du wild rumprobierst. 🙂
    Hier eine Möglichkeit. Denk aber dran, dass die Funktionssignatur hier exakt stimmen muss, also inklusive const -Qualifizierung.

    class MyClass
    {
    	public:
    		void Function()
    		{
    			// ...
    		}
    };
    
    template <typename Class>
    void DoSomething(Class& Object, void (Class::*MemFunc)())
    {
    	(Object.*MemFunc)();
    }
    
    int main()
    {
    	MyClass a;
    	DoSomething(a, &MyClass::Function);
    }
    


  • Nimm einfach boost::function.



  • Eigentlich hab ich mich in die Materie, tut mir leid das mit der Benutzung in der Theory war Falsch, thx für die Verbesserung,
    aber back to topic, kannst du mir bitte nochmal genau den unterschied zwischen deiner Funktionsdeklaration erklären und meiner erklären ich seh da keinen Unterschied, ausser dass du "typename" schreibst und ich "class" was aber ja auch keinen Unterschied mach^^.



  • Sry für den Doppelpost, hab aber jetzt auf die schnelle keinen Edit Button gefunded :

    Danke dir für deine schnelle und vor allem Funktionierende Antwort
    MfG Nusso



  • Nusso schrieb:

    aber back to topic, kannst du mir bitte nochmal genau den unterschied zwischen deiner Funktionsdeklaration erklären und meiner erklären ich seh da keinen Unterschied, ausser dass du "typename" schreibst und ich "class" was aber ja auch keinen Unterschied mach^^.

    Das Problem ist nicht die Funktionsdeklaration, sondern der Aufruf. Und eine Definition mit konkreter Callback-Implementierung hättest du dir so oder so auch überlegen müssen.

    <MyClass>Add(*MyObject, &(MyObject::MyMethod));
    

    Templates, 1. Lektion: Template-Argumente werden in spitzen Klammern nach dem Bezeichner der Klasse oder der Funktion kommagetrennt aufgelistet. Bei Funktionstemplates können die Templateargumente oft aus den Funktionsargumenten hergeleitet werden und müssen daher nicht mehr explizit hingeschrieben werden. In meinem Beispiel habe ich dies ausgenutzt; es kann die Übersicht stark fördern.

    Zeiger, 2. Lektion: Um die Adresse eines Objekts zu erhalten, kann man den Adressoperator & einsetzen. Mittels Dereferenzierungsoperator * spricht man das Objekt an, auf das ein Zeiger zeigt.

    Alles klar? 😉



  • ja danke,
    aber das habe ich gar nicht gemeint, ich habe in meinem Code
    die Funktion gar nicht aufgerufen, sonder hab sie nur deklariert
    und es gab trotzdem die ganzen Fehler ..



  • Wozu ist so eine Funktion gut?



  • Nusso schrieb:

    ja danke,
    aber das habe ich gar nicht gemeint, ich habe in meinem Code
    die Funktion gar nicht aufgerufen, sonder hab sie nur deklariert
    und es gab trotzdem die ganzen Fehler ..

    ich vermute dass die klammern um das erste "void" hier: (void)(Class::*Callback)(void) das problem waren.


Anmelden zum Antworten