Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Mai 19, 2024 02:17

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Feb 06, 2012 14:51 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo ich brauch eine Möglichkeit eine in einer klasse befindliche Funktion als Pointer zu uebergeben allerdings kann ich die klasde in der nicht mit angeben da ich verschiedene Klassen verwenden möchte und nicht immer einen neuen Typ dafür definieren will hat jemand eine Ahnung wie ich das lösen kann?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 15:48 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

ich hab das damals so gemacht. Weiß nich, ob dir das hilft:
Code:
  1.  
  2. /**Funktor-Interface für Callback-Template*/
  3. class IFileHandlerFunctor{
  4. public:
  5.     virtual void operator()(string  path) = 0;
  6.     virtual void call(string  path) = 0;
  7. };
  8.  
  9. /**Callback Template*/
  10. template <class TClass> class TFileHandlerCallbackFunctor: public IFileHandlerFunctor{
  11. private:
  12.     void (TClass::*_callback)(string);
  13.     TClass *_obj;
  14.    
  15. public:
  16.     virtual void operator()(string path){
  17.         (*_obj.*_callback)(path);
  18.     };
  19.    
  20.     virtual void call(string path){
  21.         (*_obj.*_callback)(path);
  22.     };
  23.    
  24.     TFileHandlerCallbackFunctor(TClass *obj, void(TClass::*callback)(string )){
  25.         _obj = obj;
  26.         _callback = callback;
  27.     };
  28. };


MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du kannst einen Funktionspointer auf eine statische Funktion der Klasse verwenden. Diese statischen Funktion gibst du dann einen Parameter mit für das Objekt. Also ungefähr so:

Code:
  1. class MyClass {
  2. public:
  3.     static int relayFunction(MyClass* self, Parameters p) {
  4.         return self->actualFunction(p);
  5.     }
  6.  
  7. private:
  8.     int actualFunction(Parameters p) {
  9.         return 42;
  10.     }
  11. };

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 19:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das wäre fast mal was für einen Design Challenge. Ich habe nämlich noch keine Lösung gesehen, die annähernd so befriedigend ist wie Methodenpointer in Free Pascal.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 19:30 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
hm alles glaub ich nicht ganz so dass was ich brauche oder ich seh es gerade nicht ganz?

also alles sieht so aus das ich einem button für meine GUI ein Event zuweisen möchte.

diese events sollen nun in allen möglichen Klassen liegen können ohne das ich jedes mal die erforderliche header datei einbinden und einen eigenen typedef schreiben muss. zur zeit sieht die sache so aus was allerdings nur mit "freien" funktionen funktioniert

Code:
  1.  
  2. //gui_base.h
  3. [...]
  4. enum GUI_Event_Type {ON_CLICK, ON_MOUSEOVER};
  5.  
  6. typedef int (GUI_EventFunc)();
  7.  
  8. struct GUI_Events
  9. {
  10.     GUI_EventFunc* OnClick;
  11.     GUI_EventFunc* OnMouseOver;
  12.     //GUI_EventFunc* OnDblClick;
  13.     //GUI_EventFunc* OnRightClick;
  14. };
  15.  
  16. class TGUI_Base
  17. {
  18. private:
  19.     Rect iPosition;
  20.     GUI_Events Events;
  21. [...]
  22. public:
  23. [...]
  24.     void RegisterEvent(GUI_Event_Type GUI_EVENT_TYPE, GUI_EventFunc* EventProcedure)
  25.     {
  26.         switch(GUI_EVENT_TYPE)
  27.         {
  28.         case ON_CLICK:
  29.             {
  30.                 Events.OnClick = EventProcedure;
  31.                 break;
  32.             }
  33.         case ON_MOUSEOVER:
  34.             {
  35.                 Events.OnMouseOver = EventProcedure;
  36.                 break;
  37.             }
  38.         default: break;
  39.         }
  40.     };
  41. [...]


Code:
  1.  
  2. TGUI_String Test__("Test", 0,0,&TextManager);
  3. Test__.RegisterEvent(ON_CLICK, &Window.Close); //fehler bei  &Window.Close


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Hey,

in C++11 (und auch vorher in boost) gibt es ein paar Helferlein für solche Sachen.
Einmal das wirklich ungemein mächtige, aber etwas schwer zu handhabende bind und noch ein algemeines function object, das auch bind ausdrücke wrappen kann.

Ansonsten kann ich Bergmanns Lösung nur empfehlen. Habe ich früher benutzt um kam damit super zurecht.

Und zuletzt könnte dir eine Suche nach signal und slots auch weiter helfen. Eine beliebte Methode solche GUI Events umzusetzen (z.B. in QT, boost hat glaub ich auch eine implementation).

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Feb 06, 2012 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2622
Wohnort: Berlin
Programmiersprache: Go, C/C++
Da kann ich eine sehr gute Empfehlung machen.
http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible
Den Code verwende ich in vielen Projekten, da er wirklich perfekt ist :)

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 07, 2012 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Alternativ zu Bergmanns Ansatz könntest du auch In den GCC includes, dir die Metadaten für einen Selector ankucken. Unter Mingw sind die z.B. unter "MinGW\lib\gcc\mingw32\4.6.1\include\objc" zu finden.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 01:59 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Lord Horazont hat geschrieben:
Das wäre fast mal was für einen Design Challenge. Ich habe nämlich noch keine Lösung gesehen, die annähernd so befriedigend ist wie Methodenpointer in Free Pascal.

greetings

Na Lambdas in Scala, python, ruby, haskell, C# und bald auch Java ^^
Und in generell allen funktional angehauchten Sprachen existiert das Problem so gar nicht, weil functions dort eh first class objects sind. Dort reicht man sowieso andauernd Funktionen in der Gegend herum.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 08:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Frase hat geschrieben:
Na Lambdas in Scala, python, ruby, haskell, C# und bald auch Java ^^

C++ hat auch Lambdas… Naja, aber das Problem was ich bei C++ eher sehe ist, dass Klassen keine First Class Objects sind. Das ist echt übel und versaut einem öfter die Tour (gerade wenn man an den Komfort von FreePascal gewöhnt ist).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 21:22 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
C++ hat Lambdas? Ich lass jetzt mal Funktionspointer nicht als Lambda gelten. Das ist halt der Notbehelf. Aber eigentlich möchte man ja so etwas:
Code:
  1. List(5, 3, 0, 2, 8, 4, 1).sort((a, b) => a < b)
Geht sowas mit C++ ähnlich kompakt?

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 21:44 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2622
Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
  1. std::vector<int> v={5,3,0,2,8,4,1};
  2. std::sort(v.begin(),v.end(),[](int a,int b){return a<b;});


STL liefert in den Containern keine höhere Logik mit, diese ist seperat, damit diese nicht für jeden Container nochmal existiert.
Damit muss der Coder ein bisschen mehr tippen aber dafür ist der Speicherverbrauch geringer und Optimierungen wirken sich auf alle Container aus.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 08, 2012 22:31 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
Ahh, kann es sein, dass die Dinger neu sind in C++11?

Edit: Ja, sind sie!

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]