Ich versuche, mir selbst C++ beizubringen, und als ein erstes Projekt möchte ich Code für die Durchführung von Newton-Methode auf Funktionen einer einzelnen Variablen erstellen. Ich möchte eine Klasse ObjectiveFunction
machen, die benutzerdefinierte Funktionen für die Zielfunktion, die erste Ableitung und die zweite Ableitung speichert.Member Attribute, die Funktionen in C++ sind
Ich mag der Konstruktor von ObjectiveFunction
zwischen 0 und 3 Argumente nehmen, wobei die Argumente selbst Funktionen sind:
// ObjectiveFunction.h
// Class definition for an Objective Function object.
#ifndef OBJECTIVE_H
#define OBJECTIVE_H
class ObjectiveFunction
{
public:
// Constructors
// Default constructor
ObjectiveFunction();
// Constructor with just objective function.
ObjectiveFunction(double f(double));
// Constructor with objective function and derivative function.
ObjectiveFunction(double f(double), double fp(double));
// Constructor with objective, derivative, and second derivative functions.
ObjectiveFunction(double f(double), double fp(double), double fpp(double));
// Methods
void setObjectiveFunction(double f(dobule));
void setDerivativeFunction(double f(double));
void setSecondDerivativeFunction(double f(double));
double evalObjectiveFunction(double);
double evalDerivativeFunction(double);
double evalSecondDerivativeFunction(double);
private:
// Storage for the functions.
// This is the part I'm not sure of.
// Attempt with function pointers
double (*objFunc)(double);
double (*d1Func)(double);
double (*d2Func)(double);
};
#endif // OBJECTIVE_H
Wie würde ich private Datenelemente erstellen, die selbst Funktionen sind. Ich möchte Funktionsobjekte erstellen, die (außer privat) zugänglich wären wie foo.obj_func(3.0)
oder foo.deriv_func(3.0)
, wobei obj_func
vom Konstruktor basierend auf den Funktionen, die der Benutzer an die Klasse übergibt, festgelegt wird.
Was ist der richtige Weg? Es wäre am besten, wenn es einen Weg gibt, der nicht auf einen Zeiger auf ein Funktionsobjekt angewiesen ist, aber ich denke, wenn das der einzige Weg ist, dann ist es das, was ich lernen muss.
Funktion Zeiger ist genau das, was Sie brauchen (weil das ist, was Sie in Ihre Konstruktoren übergeben). –
Ich habe den Abschnitt 'private' mit meinem Versuch mit Funktionszeigern geändert. Ist das die richtige Idee? – ely
In C++ 11 können Sie std :: function verwenden. –