1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : août 2015
    Messages : 22
    Points : 17
    Points
    17

    Par défaut Programmation générique et classes abstraites

    Bonjour,

    Je réutilise du code de mon professeur qui a codé un peu de programmation générique. Je vais essayer de ne mettre que le code important pour le sujet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
      std::vector<double> monte_carlo(int n, Gen G)
    {
    	std::vector<double> result(3,0);
    	double x;
    	for (int j = 0; j < n; j++) {
    		x = G();
    		result[0] += x;
    		result[1] += x*x;
    		if(j%1000==0){std::cout << j<< std::endl;}
    	}
    	result[0] /= (double) n;
    	result[1] = (result[1] - n*result[0]*result[0])/(double)(n-1);
    	result[2] = 1.96*sqrt(result[1]/(double) n);
    	return result;
    }
     
    /****** Composition d'une fonction et d'une VA ************/
    template <class _Result>
    struct generator
    {
    	typedef _Result result_type;
    };
     
    template <typename Fct, typename VA>
    struct compose_t : public generator< typename Fct::result_type >
    {
    	compose_t(Fct f, VA X) : f(f), X(X) {};
    	typename Fct::result_type operator()() {
    		return f(X());
    	};
    	private:
    		Fct f; VA X;
    };
     
    template <typename Fct, typename VA>
    inline compose_t<Fct, VA>
    compose(Fct f, VA X) {
        return compose_t<Fct, VA>(f, X);
    };
    J'arrive à reutiliser ce code mais j'ai un probleme quand je veux utiliser une classe abstraite (avec des classes filles qui instancie la méthode). En l'occurence j'utilise le code comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vector<double> Pricer::Pricing(vector<double> initials,int n, Payoff& pay){
         return monte_carlo(n, compose(pay,VA));
    }
    VA est une instance d'une classe qui surchage l'opérateur () et renvoie un objet qu'utilise l'operateur() de pay.
    PayOff est defini comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      struct Payoff:public AllFunctions{
          Payoff(Market mar,vector<double> initials):AllFunctions(mar,initials){}
          virtual double operator()(tabl tab)=0;
    };
     
    struct Payoff_BLAC:public Payoff{
           double L;
           Payoff_BLAC(double l,Market mar,vector<double> initials):Payoff(mar,initials),L(l){}
           double operator()(tabl tab);
    };
    le compilateur indique : Nom : pp.png
Affichages : 71
Taille : 11,1 Ko

    En résumé le probleme apparait quand je passe à la fonction Pricing une reference d'une classe abstraite plutot directement un object d'une des classe filles qui ne sont pas abstaite.
    Je veux faire ca pour pouvoir, de facon assez classique je crois, ne pas avoir à réecrire la fonction Pricing pour chaque classe fille ( la classe mère est une "interface")

  2. #2
    Expert éminent
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 244
    Points : 9 210
    Points
    9 210

    Par défaut

    Je ne pense pas soir très pertinent de mélanger l'héritage avec ce type de template.

    Je ne sais pas si syntaxiquement vous n'allez pas droit dans le mur, mais déjà sémantiquement, il y a un gros problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template <typename Fct, typename VA>
    struct compose_t : public generator< typename Fct::result_type >
    {
    	compose_t(Fct f, VA X) : f(f), X(X) {};
    	typename Fct::result_type operator()() {
    		return f(X());
    	};
    	private:
    		Fct f; VA X;
    };
    Il faut donc que Fct et VA soient au moins instanciable par constructeur de copie. Ce qui est très moyennement faisable par des classes abstraites.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : août 2015
    Messages : 22
    Points : 17
    Points
    17

    Par défaut

    Euh oui effectivement, à cause du f(f), X(X) ... pourtant jai déja utilisé la fonction avec une classe X sur laquelle je n'ai pas de défini de constructeur par copie (et ca marchait héhé), j'en déduis qu'il a un constructeur par copie par défaut ?

    Que conseillez vous donc de faire, une fonction template? ( ce qui tout a coup me semble faire sens, pour rester dans le generique)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : août 2015
    Messages : 22
    Points : 17
    Points
    17

    Par défaut

    Je confirme, ca marche très bien avec une fonction template. L'idée est donc de rester dans le générique. Merci pour votre aide !

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 517
    Points : 2 655
    Points
    2 655

    Par défaut

    Citation Envoyé par alebdeb Voir le message
    Euh oui effectivement, à cause du f(f), X(X) ... pourtant jai déja utilisé la fonction avec une classe X sur laquelle je n'ai pas de défini de constructeur par copie (et ca marchait héhé), j'en déduis qu'il a un constructeur par copie par défaut ?
    Il y a un constructeur de copie automatique entre une Derivée et une Base. Attention il va créer une Base qui perdra toute information sur son type originel!
    Pour garder les caractéristiques dérivées en ayant des fonctions n'utilisant que la Base commune, il faut impérativement voir l'objet par une référence (& ou &&) ou un pointeur, jamais par copie.
    Pour ton type on pourrait avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template<typename Fct, typename VA>
    struct compose_t : public generator< typename Fct::result_type >
    {
    	compose_t( Fct &&f , VA const &x ) : f(f), x(x) {};
    	typename Fct::result_type operator()() {
    		return f( X() );
    	};
    	private:
    		Fct &&f;
    		VA const &x;
    };

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interface, classe abstraite ou classe générique
    Par Maurine dans le forum Général Java
    Réponses: 0
    Dernier message: 27/08/2013, 15h14
  2. Réponses: 14
    Dernier message: 26/01/2011, 22h18
  3. Réponses: 4
    Dernier message: 21/05/2010, 10h46
  4. Réponses: 2
    Dernier message: 25/12/2008, 20h51
  5. Classe abstraite et programmation multifichiers.
    Par Ubiquité dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2008, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo