IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

les functors ou function objet en c++


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut les functors ou function objet en c++
    salut à tous,
    est ce que quelqu'un pourrait m'aider svp ?
    en ce qui concerne les functors ou bien les functions objets.
    j'ai la classe functor suivante:
    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
    template <class EOT>
    class eoWeakElitistReplacement : public eoReplacement<EOT>
    {
    public :
      typedef typename EOT::Fitness Fitness;
     
      // Ctor, takes an eoReplacement
      eoWeakElitistReplacement(eoReplacement<EOT> & _replace) :
        replace(_replace) {}
     
      /// do replacement
      void operator()(eoPop<EOT>& _pop, eoPop<EOT>& _offspring)
      {
        const EOT oldChamp = _pop.best_element();
        replace(_pop, _offspring);	   // "normal" replacement, parents are the new
        if (_pop.best_element() < oldChamp) // need to do something
          {
    	typename eoPop<EOT>::iterator itPoorGuy = _pop.it_worse_element();
    	(*itPoorGuy) = oldChamp;
          }
      }
    private:
      eoReplacement<EOT> & replace;
    };

    je voudrais utiliser ce functor est ce que ce code est correcte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     eoReplacement <Indi>& _repl;
      eoWeakElitistReplacement <Indi>(_repl);// instanciation
    eoPop<Indi>& _pop1;
    eoPop<Indi>& _pop2;
     eoWeakElitistReplacement (pop1,pop2); // pour utiliser la function operator


    Merci pour votre aide.

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Mis a part un pb de référence nul, je pense bien (tu a des Class<Type>& non-instanciés).
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par annesophiedecar Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     eoReplacement <Indi>& _repl;
      eoWeakElitistReplacement <Indi>(_repl);// instanciation
    eoPop<Indi>& _pop1;
    eoPop<Indi>& _pop2;
     eoWeakElitistReplacement (pop1,pop2); // pour utiliser la function operator
    Probablement une erreur de copier/coller, mais tu ne peux définir une référence sans l'initialiser. Donc _repl, _pop1 et _pop2 sont probablement des valeurs et non des références. Et tu n'as pas nommé ton instance de eoWeakElitistReplacement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    eoReplacement <Indi> _repl;
    eoWeakElitistReplacement <Indi> mon_foncteur(_repl);// instanciation
    eoPop<Indi> _pop1;
    eoPop<Indi>_pop2;
    mon_foncteur(pop1,pop2); // pour utiliser la function operator

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    Merci pour votre aide.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    svp si vous me permettez j'ai une autre question sur les functors.
    j'ai la classe functor suivante:
    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
    41
    42
    43
    44
    45
    46
    47
    48
     
    #ifndef eoFeatureSelectionClone_H
    #define eoFeatureSelectionClone_H
    #include <math.h>
    #include <float.h>
    #include <eoGenOp.h>
    #include <eoOp.h>
    #include <eoPopulator.h>
    #include <eoPop.h>
     
    template<class GenotypeT> 
     
    class eoFeatureSelectionClone: public eoGenOp<GenotypeT>
    {
    public:
      /**
       * (Default) Constructor.
       */
      eoFeatureSelectionClone(){}
     
      /// The class name. Used to display statistics
      string className() const { return "eoFeatureSelectionClone"; }
     
      /// The TOTAL number of offspring (including modified parents)
      unsigned max_production(void) { return 1000;}//(popSize*beta)*popSize; }
    void operator()(eoSeqPopulator<GenotypeT>& _pop)
        {
        _pop.reserve(max_production());
          apply(_pop);
        }
    void apply(eoPopulator<GenotypeT>&_pop) 
    {  ;
    _pop.reserve(1000);
     
    int j=0;
    while (j!=100)
        {GenotypeT offsprings=_pop.select();
     
    for(unsigned i=0;i<10;i++)
    {_pop.insert(offsprings);
    offsprings.invalidate();
    //_pop.insert(const EOT& _eo);}
    //return oneAtLeastIsModified;
    *++_pop;}
    j++;}}
    };
     
    #endif
    je veux utiliser cette classe functor j 'écrit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     eoPop<Indi> destination  (1000,_init); 
    eoSeqPopulator <Indi> populator(_pop,destination);
    eoGenOp<Indi> *clone = new eoFeatureSelectionClone<Indi>();//(popSize, beta,eoPop<EOT>& _pop);
     
    clone(populator);
    mais ceci me génére les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/tutorial/FeatureSelection2/make_op_FeatureSelection.h: In function «eoGenOp<EOT>& do_make_op(eoParameterLoader&, eoState&, eoInit<EOT>&, eoPop<EOT>, EOT)":
    /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/tutorial/FeatureSelection2/make_op_FeatureSelection.h:133: erreur: «clone" cannot be used as a function
    /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/tutorial/FeatureSelection2/make_op_FeatureSelection.h: In function «eoGenOp<EOT>& do_make_op(eoParameterLoader&, eoState&, eoInit<EOT>&, eoPop<EOT>, EOT) [with EOT = eoFeatureSelection<eoScalarFitness<double, std::less<double> > >]":
    /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/tutorial/FeatureSelection2/FeatureSelectionEA.cpp:60:   instantiated from here
    /home/anne/Bureau/paradiseo-1.2.1/paradiseo-eo/tutorial/FeatureSelection2/make_op_FeatureSelection.h:133: erreur: «clone" cannot be used as a function
    make[2]: *** [tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/FeatureSelectionEA.cpp.o] Erreur 1
    make[1]: *** [tutorial/FeatureSelection2/CMakeFiles/FeatureSelectionEA.dir/all] Erreur 2
    Merci pour votre aide.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (*clone)(populator);
    // ou beaucoup moins intéressant comme écriture :
    clone->operator()(populator);
    Pourquoi allouer dynamiquement ton foncteur ? Les foncteurs ont souvent une logique de copie par valeur.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    Merci beaucoup 3DArchi pour votre réponse! ça marche! j'ai utilisé votre premiere proposition puisque vous m'aviez dit que c'est plus intéressant!
    Mais j'ai pas vraiment compris ce que vous voulez dire par "Pourquoi allouer dynamiquement ton foncteur ? Les foncteurs ont souvent une logique de copie par valeur" si vous avez une proposition c'est vraiment avec joie parce que franchement j'arrive pas à très bien comprendre les functors

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu alloues ton foncteur dynamiquement, c'est à dire sur le tas via le new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eoGenOp<Indi> *clone = new eoFeatureSelectionClone<Indi>();
    Je dit que les foncteurs s'utilisent souvent par valeur, c'est à dire qu'on les transmet ni par pointeur ni par référence :
    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
     
    struct mon_foncteur
    {
       void operator()(A const&a_)const
       {
           a_.do_it();
       }
    };
    void invoke(
       mon_foncteur foncteur_ // passage par valeur ni par référence (mon_foncteur const &) ni par pointeur (mon_foncteur const *)
       , A const &a_
    )
    {
       foncteur_(a);
    }
    Le passage par valeur car :
    -> ce sont généralement des objets sans (ou presque) état - cad avec pas ou peu de variables internes -
    -> ils est rare de les utiliser de façon polymorphe (héritage)
    Il n'y a donc pas de surcoût de copie à les passer par valeur.

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2009
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 53
    Points : 16
    Points
    16
    Par défaut
    merci pour votre réponse 3DArchi je comprend beaucoup mieux!

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

Discussions similaires

  1. Classe, typer les variables d'un objet.
    Par Choupi dans le forum Général Python
    Réponses: 3
    Dernier message: 20/04/2006, 18h15
  2. [2.0] Comment mesurer les ressources allouées à un objet ?
    Par NeoMan dans le forum Framework .NET
    Réponses: 7
    Dernier message: 22/02/2006, 18h48
  3. Réponses: 1
    Dernier message: 20/02/2006, 10h59
  4. Réponses: 7
    Dernier message: 13/02/2006, 17h13
  5. Comment Obtenir en JS les infos d'un objet HTML ?
    Par prin-prin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/12/2005, 16h50

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