Ich habe eine frage zu Function pointer in C++. Habe eine Methode:
Code:
MyClass* CreateMyClass() { return new MyClass(); }
Nun pack ich diese methode in einen void* typ.
Code:
void* procAddress = (void*)CreateMyClass;
Nun möchte ich diese methode aus dem procAddress aufrufen. Dazu muss es irgendwie in einen function pointer konvertiert werden damit es als callback nutzbar wird.
Wie funktioniert sowas ?
In Delphi sehe das so aus:
Code:
function CreateMyClass() : TMyClass; begin Result := TMyClass.Create(); end;
Code:
type TMyClassConstructor = function() : TMyClass; var P : Pointer; // void* funcPtr : TMyClassConstructor; N : TMyClass; begin P := @CreateMyClass; funcPtr := TMyClassConstructor(P); N := funcPtr(); end;
Danke, Final
Zuletzt geändert von Lord Horazont am Di Mär 01, 2011 18:37, insgesamt 1-mal geändert.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Einfacher als du denkst glaube ich. Jede Funktionsreferenz ohne () geschrieben ist in C++ ein Funktionspointer. Mit einem entsprechenden Typedef kannst du dann einfach zuweisen, z.B. für eine Funktion die zwei Floats nimmt und einen zurückgibt:
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
The parenthesis around *pFoo are necessary for precedence reasons,
Also sollte es wahrscheinlich so aussehen:
Code:
void (* procAddress) = CreateMyClass;
(Bei einer Funktionszuweisung zu einer Variable dürfen keine Klammern sein.)
Zitat:
This would actually assign the return value from a call to function goo() to pFoo, which isn’t what we want. We want pFoo to be assigned to function goo, not the return value from goo(). So no parenthesis are needed.
Einfacher als du denkst glaube ich. Jede Funktionsreferenz ohne () geschrieben ist in C++ ein Funktionspointer. Mit einem entsprechenden Typedef kannst du dann einfach zuweisen, z.B. für eine Funktion die zwei Floats nimmt und einen zurückgibt:
Warum brauchst du eigentlich Funktions-Pointer? Diese braucht man eigentlich nicht wenn man objekt-orientiert programmiert. Die einzig sinnvolle Anwendung die mir einfällt ist die Nutzung für Callback-Funktionen einer C-Library die darauf basiert.
Warum brauchst du eigentlich Funktions-Pointer? Diese braucht man eigentlich nicht wenn man objekt-orientiert programmiert. Die einzig sinnvolle Anwendung die mir einfällt ist die Nutzung für Callback-Funktionen einer C-Library die darauf basiert.
Ganz einfach, ich bastel gerade ein Pluginsystem das ähnlich aufgebaut ist, wie das von Andora
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Auch OOP benutzt funktions pointer, das hat nichts mit OOP zu tun, denn java, c# und co sind OOP aber alle haben delegate pattern in nutzung. Wieso weil es oft Code leserlicher und einfacher macht. Im RadonFramework hab ich z.B. Events und Signals, welche ledeglich ein method oder function pointer im hintergrund nutzt. Statt nun eine klasse zu erzeugen, die von einem vorher definiertem Interface ableitet , nur um dann eine instanz dieser einen Objekt zu zuweisen, damit ich gleiches verhalten hab ist ein enormer mehraufwand. Die VCL von Delphi, WPF von .Net und viele Netzwerk, Eventreiche Systeme aus Java nutzen delegates. Als C++ler sollte man aber die fastdelegates lib verwenden.
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.