Member-Funktionen als Parameter uebergeben
-
Hallo allerseits,
folgendes Vorhaben (in verk"urzter Form, also nur das wesentliche):
Innerhalb einer Klasse "C" werde die Member-Funktion "evaluate"
als Parameter in eine Funktion "integrate" gegeben. (Das C.h lasse
ich hier mal weg.)file C.cpp
... class C { double evaluate(double x){ //Implementation von evaluate. Z.B. Interpoliert es einen R"uckgabewert //anhand Objektspezifischer privater Daten (ein in C.h deklariertes array). } double calc_integrals(...) { ... double x = integrate(evaluate, a,b); //error-Zeile double y = integrate(evaluate, c,d); //error-Zeile ... } }Funktion "integrate" enstamme einer entsprechenden Algorithmensammlung mit
der Deklaration:
double integrate(double func(double) , double a, double b);Sinnhaftigerweise gibt es viele Objekte des Typs C mit ihren spezifischen
Daten. Jedes Objekt hat seine eigenen Integrale. Ich gehe davon aus,
dass evaluate (aufgerufen innerhalb integrate)
auf die in dem aktuellen Objekt vorhandenen Daten zugreift.Nun gibt der compiler die Fehlermeldung:
error: argument of type ‘double (C::)(double)’ does not match ‘double (*)(double)Meine Verst"andnis: Statt einen Zeiger auf eine double-Funktion bekommt
integrate ein (C::) Ich stelle fest, dass der Aufruf mitsamt Zigriffsoperator
keinen Unterschied macht. Zudem sollte es auch eindeutig sein welche evaluate gemeint ist.Mit Gew"ohnung an eine funktionale Sprache und Matlab vermag ich
aus der Literatur nicht festzustellen, wie es in diesem Fall bei
Member-Funktionen gemacht werden muss. Genau den Fall habe ich nicht gefunden.
Ich hoffe um unn"otig einzuf"uhrende Zeiger etc. herumzukommen.
Das sog. currying gibt es in C++ angeblich so ohne weiteres nicht.Gruss und dankend im Voraus:)
Daniel
-
du müsstest an evaluate auch einen double-Wert übergeben, weil du die Methode lediglich mit evaluate aufrufst (was genau genommen kein Methodenaufruf ist, müsste zumindest evaluate() dort stehen), und du keinen Default-Wert für dein x in evaluate hast, is ja irgendwie klar, dass es eigentlich nicht funktionieren kann, für nen Methodenaufruf von evaluate bräuchtest du zumindest schon mal Klammern und dann halt noch nen Übergabewert, wie z.B.
double x = integrate(evaluate(3.15),a,b);
Vllt könnte das helfen.
-
Ich denke nicht, dass es so ist.
Die Funktion integrals möchte ja einen Funktionspointer double func(double) und nicht das Ergebnis, was evalutate(2.4) ja bringen würde.
Es wird eher so sein, dass integrals intern evaluate mit einem seiner double-Parameter aufruft.Das Problem ist eher, dass evaluate eine Klassenmethode ist und daher die Signatur
double C::evaluate(double) und nicht double evalutate(double) hat.
Ändere die Definition von integrals.
Vondouble integrals(double func(double), double, double); // nach double integrals(double C::func(double), double, double);So weiß der Compiler, dass er eine Methode von C als Zeiger bekommt.
Da das ganze innerhalb einer Klasse passiert, dürfte es soweit klappen.Viel Erfolg!
-
Dank dem Hinweis von hehejo, er/sie hatte den Sinn des Programms verstanden.
Den Vorschlag hatte ich jedoch schon ausprobiert (obwohl es nicht sein d"urfte, die Funktion "integrals", ausschliesslich auf Memberfunktionen von C als Parameter zu beschr"anken zu m"ussen). Jedenfalls kommt mit der Deklaration von "integrate" (nicht "integrals", gell) der Art:
#include"C.h" double integrate(double C::func(double) , double a, double b);dabei ein Syntax fehler raus:
error: expected unqualified-id before ‘(’ token
error: expected ‘,’ or ‘...’ before ‘(’ tokenAnbei: "integrate" befindet sich ausserhalb der Klasse C.
hm..?!
-
Bin mir net sicher, aber haben Funktion-Pointer net immer die Syntax
(rückgabeWert)(*fct)(parameter)?
Dann müsste des doch
double integrate((double) (C::func(double) , double a, double b);
ne des ist mir zu kompliziert, schreib doch so was in der Art
typedef FCTPTR (double)()(double);
double integrate(FCTPTR fct,double a, double b);