Funktionspointer auf Klasse zur Berechnung eines Integrals
-
hallo erstmal.
Ich habe die Aufgabe eine klasse zu schreiben die die Integration einer einfachen Funktion vornimmt bei der die Integrationsgrenzen und die Anzahl der Iterationsschritte private sind und somit mit get und set routinen eingelesen werden müssen. War ja alles schön und gut nur plagt mich der Funktionspointer der im selben Beispiel ohne Klassenaufteilung wunderbar funktioniert.Erstmal die Klassendeklaration mit ein bisschen inline definition :
#include<iostream> #include<cmath> using namespace std; class integral { public: integral() {lower=1; upper=10; step=100;} //constructor of objects of the class integral ~integral(){} //destructor of objects of the class integral double f(double x){return sqrt(5*x-1);} double trapezium(double (*f)(double),double,double,int); double rectangle(double (*f)(double),double,double,int); double GetLower() {return lower;} //inline defined get Routines double GetUpper() {return upper;} int GetStep() {return step;} void SetLower(double p) {lower=p;} //inline defined set routines void SetUpper(double p) {upper=p;} void SetStep(int p) {step=p;} void ShowResultTrapezium(); void ShowResultRectangle(); private: double lower; double upper; int step; };Hier das File der Klassendefinition :
#include"integralclassheader.h" #include<iostream> #include<cmath> using namespace std; void integral::ShowResultTrapezium() { cout <<endl<<"Approximated integral value (trapezium rule) : "<<integral::trapezium(f,lower, upper, step)<< endl; } void integral::ShowResultRectangle() { cout <<endl<<"Approximated integral value (rectangle rule) : "<<integral::rectangle(f,lower, upper, step)<< endl; } double integral::trapezium(double(*f)(double), double lower, double upper, int step) { double xi,h,result=0; h=(upper-lower)/step; for(int i=1;i<step;i++) { xi=lower+i*h; result=result+f(xi); } result=(f(lower)/2 + result + f(upper)/2)*h; return result; } double integral::rectangle(double(*f)(double), double lower,double upper,int step) { double h,result=0; h=(upper-lower)/step; for(int i=1;i<=step;i++) { result=result+f(lower+(i-(1./2))*h); } result=result*h; return result; }und zuletzt die main :
#include"integralclassheader.h" #include<iostream> #include<cmath> using namespace std; int main() { integral integralobject; double inLower, inUpper; int inStep; cout<<"This program calculates the integral of a function with the trapezium and "<<endl; cout<<"the rectangle rule and prints the results to stout. All operators "<<endl; cout<<"and methods are stored in the class integral. By entering the values "<<endl; cout<<"of a,b and n ,the constructor defines an object we can work with."<<endl<<endl; cout<<"--------------------------------------------------------------------"<<endl<<endl; cout << "Enter lower integral border a : "; cin >> inLower; integralobject.SetLower(inLower); cout << "Enter upper integral border b : "; cin >> inUpper; integralobject.SetUpper(inUpper); cout << "Enter number of iteration steps n : "; cin >> inStep; integralobject.SetStep(inStep); cout<<endl<<"--------------------------------------------------------------------"<<endl; integralobject.ShowResultTrapezium(); integralobject.ShowResultRectangle(); cout<<endl; system("pause"); return 0; }Mein Problem ist jetzt dass alles was früher mit dem Funktionszeiger so toll geklappt hat nicht mehr funktioniert.
im Aufruf der Funktion in der Show - Methode schlägt mir der Compiler folgende Syntax vor :
Und zwar &integral::f zu schreiben statt nur f. Doch dann häufen sich die Fehlermeldungen ins uferlose. Von der Ausprogrammierung der numerischen Integration her läuft das Programm ohne Probleme da ich diese Teile in Extraprogrammen gesondert untersucht habe. Also bleibt nur die Frage des Funktionzeigers.
Kann mir vielleicht jemand helfen ?
-
eine nichtstatische memberfunktion kann nur mit einem this-pointer aufgerufen werden.
schreib mal ein static vor die deklaration von f().
-
Vielen dank. Jetzt funktioniert das Programm wie es soll.
Ich hab das jetzt mal so geschrieben dass ich ohne Probleme auf die Funktion f zugreifen kann. Ich werde nun versuchen es ohne static und mit this -> zu arbeiten. Wenns nicht funktionieren will melde ich mich nochmal