Surcharge de fonction virtuelle pure
Bonjour à tous
Aller, tout de suite, un petit ECM, pour présenter le problème, que je commente ensuite:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <cassert>
class FitFonction { /// classe abstraite
public:
/// Accesseurs
std::vector<double> getParams() const { return _params; };
int getNbParams() const { return _params.size(); };
double get( int i ) const { return _params[i]; };
/// Setters
void setParams(const std::vector<double>& param){ assert(param.size()==_params.size()); _params=param; };
/// Pour evaluer la fonction
virtual double eval(double x) const=0; // le "= 0" à la fin indique que c'est une fonction virtuelle pure
std::vector<double> eval(const std::vector<double>& x) const { /// <----- ici je surcharge la fonction eval
std::vector<double> res(x.size(),0.0);
for (int i=0;i<x.size();i++) res[i]=eval(x[i]);
return res;
};
protected:
std::vector<double> _params;
};
class Gaussienne : public FitFonction { /// 1 Gaussienne = 3 paramètres
public:
Gaussienne(double h, double c, double e){ _params.resize(3);
_params[0]=h; _params[1]=c; _params[2]=e; };
double eval(double x) const {return _params[0]*exp(pow((x-_params[1])/_params[2],2.0));};
};
int main( int argc, char* argv[] ){
Gaussienne fct(1.3,2.0,5.3);
std::vector<double> xx(7,0.2),yy(7);
//yy=fct.eval(xx);
std::cout << "Hello World !" << std::endl;
} |
Je créé une classe FitFonction, qui va donc regrouper plusieurs type de fonction mathématique de base.
Ces fonctions de bases dépendent de paramètres (que je met en attribut de classe).
Quelquesoit la fonction mathématique, je vais avoir envie de l'évaluer, en un point ou en un vecteur de points.
Je créer donc la méthode "virtual double eval(double)" en virtuelle pure, car elle dépendra de ma fonction mathématique (dans l'exemple j'ai pris une gaussienne, mais on pourrait très bien y ajouter des fonctions affines, logarithmiques, etc...).
Je définis ensuite ma méthode d'évaluation dans ma classe fille Gaussienne.
Jusque là tout va bien.
Maintenant, je vais souvent avoir besoin d'évaluer, non pas un seul point, mais un vecteur de point.
Je veux donc surcharger ma fonction eval: "std::vector<double> eval( const std::vector<double>& )".
Et c'est ce que j'essaie de faire ligne 19 à 23, mais il semble que ca ne marche pas ...
Dans le main, je veux pouvoir décommenter la ligne 40. Si je le fais je me fais insulter par le compilo :
Citation:
test.cxx:91:15: error: no viable conversion from 'std::vector<double>' to 'double'
yy=fct.eval(xx);
^~
Merci pour votre aide.