Funktionszeiger zurückgeben
-
Hi Leute ich hab da ein Problem!
Ich hab ne Klasse geschrieben die einige Zeiger auf Funktionen besitzt.
Beispielsweise so definiert:int (*pfFunktion)(int, float); // Definition des Funktionszeigers
Jetzt habe ich die aber als private-Elemente definiert und würde sie nur ungerne public machen. Doch jetzt brauche ich natürlich Zugriffsfunktionen.
Besonders wichtig ist natürlich die Get-Funktion aber da weis ich jetzt nicht wie ich die dann deklarieren soll. Ich habs mal so probiert:(int (*pfFunk)(int, float)) GetFunktionPointer() { return pfFunktion; }
Das sieht nicht nur ziemlich seltsam aus sondern funktioniert auch nicht
Wenn mir da jemand helfen kann wär ich sehr dankbar!
Mfg Nico
-
Dann mach es dir doch einfach und verwende typedef
typedef int (*pfFunktion)(int, float); pfFunktion GetFunction() { //... }
-
int (*GetFunktionPointer())(int, float) { return pfFunktion; }
-
Bashar schrieb:
int (*GetFunktionPointer())(int, float) { return pfFunktion; }
so mögen wir das
-
Ok super!
Danke an euch.
Mir sind mitlerweile auch noch 2 andere Ideen gekommen.
1. Einfach die Adresse (also den Zeiger) als Long zurückzugeben und dann wieder in einen Zeiger zu casten.2. Einfach der Funktion die Adresse des Zeigers als Parameter übergeben, sodass diese ihn dann so ausrichtet das er auf meine Funktion zeigt.
Aber da sind eure Lösungen doch noch einfacher.
Also vielen Dank!
-
Mir sind mitlerweile auch noch 2 andere Ideen gekommen.
1. Einfach die Adresse (also den Zeiger) als Long zurückzugeben und dann wieder in einen Zeiger zu casten.gruselig.
2. Einfach der Funktion die Adresse des Zeigers als Parameter übergeben, sodass diese ihn dann so ausrichtet das er auf meine Funktion zeigt.
umständlich. immerhin brauchst du dann immer extra eine variable und kannst den zeiger nicht direkt verwenden. ist auch vom stil her fragwürdig.
-
Wenn du schon casten willst, dann nimm void* dann stimmt wenigstens der Typ.
-
Jaja mir ist schon klar das das nicht die Ideallösungen sind.
Mir ist allerdings nix besseres eingefallen.
Das was ihr mir da geschrieben habt, hat übrigens perfekt funktioniert!
Genauso wollte ich es haben. Ich bin nämlich auch ein Freund des direkten Return-Werts!
Wenns geht immer direkt zurückgeben.
Aber in all der Zeit wo ich jetzt mit C und C++ schreib, hab ich wirklich noch nie ne Funktion gebraucht die einen Zeiger auf eine andere Funktion zurückgibt
-
lecker währen für dich vielleicht auch funktionsobjekte, also objekte die den operator() überladen haben um wie funktionen auszusehen. die sind an einigen stellen echt angenehmer zu verwenden!
-
User--- schrieb:
Wenn du schon casten willst, dann nimm void* dann stimmt wenigstens der Typ.
Man kann Funktionszeiger nicht nach void* casten.
Felix
-
Phoemuex schrieb:
Man kann Funktionszeiger nicht nach void* casten.
Natürlich kann und darf man das. Was man nicht darf, ist nach void* konvertieren (einen neuen void* mit dem gecasteten void* initialisieren - das wäre tödlich). Man darf auch nur in das zurück-casten was es vorher mal war. Da durch den cast nach void* der Typ wech is, eine heikle Angelegenheit.
-
7H3 N4C3R schrieb:
Phoemuex schrieb:
Man kann Funktionszeiger nicht nach void* casten.
Natürlich kann und darf man das. Was man nicht darf, ist nach void* konvertieren (einen neuen void* mit dem gecasteten void* initialisieren - das wäre tödlich).
In einen Typ casten und in einen Typ konvertieren sind zwei Namen für dasselbe Ding. Es gibt auch keine zwei Arten von void* -- einmal "gecasteter" und einmal "richtiger" oder sowas. Es gibt höchstens lvalues und rvalues, aber das tut hier nichts zur Sache, das kannst du nicht gemeint haben.
-
Ja, da hast Du recht. Was ich meinte, war eine Intialiserung eines neuen Wertes, nicht Konvertierung.
Ich hab's aber auch nochmal nachgeschaut - eine Konvertierung von function pointer nach void Pointer scheint wirklich nicht vorgesehen zu sein. Dachte eigentlich, das sei zulässig, solange man keinen Unfug damit treibt.
-
sorry, warum soll man nen Funktionszeiger nicht nach void* casten können und das dann wieder nem anderen void* zuweisen und das noch einem? Klar geht das, möchte ich sagen ... Wie kommt Ihr da drauf, dass das nicht gehen soll?
-
Weil auf jeden Fall beide nicht gleich-breit sein müssen.
-
deswegen:
"ComeauTest.c", line 9: error: a value of type "void (*)()" cannot be used to
initialize an entity of type "void *"hm, hab ich nicht gewusst
-
Hallo,
Das ist nicht standardkonform, geht aber (zumindest mit g++) mit einem C-style Cast.
-
Braunstein schrieb:
Das ist nicht standardkonform
Korrekt. Zumindest nicht konform zum C++ Standard. Auf POSIX-konformen Systemen ist aber garantiert, dass void* und Funktionszeiger die selbe größe haben. Hier ist ein (C-Style-Cast) von Funktionszeiger nach void* und zurück ok.