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

C++ Discussion :

Foncteur et vecteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut Foncteur et vecteur

    Depuis ce matin je n'arrive pas à mettre en oeuvre un vector de methode.

    J'ai un class A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
       void methode1();
       void methode2();
       void methode3();
       void methode4();
    /* et d'autre avec toujours le même prototype*/
    }
    Et j'aimerais pouvoir faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<functor> vect_func;
    for_each(vect_func,print_name,execute);//syntaxe totalement fausse mais l'idée est là
    Il me faut donc aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class functor
    {
       string name;
       void print_name();
       void operator ();
    }
    Enfin je vous met tout ça pour avoir l'idée parce que là je suis un peu perdu dans mes foncteurs. Comme faire correspondre mes A::methodes avec un objet functor ?

    Pour résumé je souhaite juste faire un vecteur de pointeurs de fonctions (des méthodes d'une classe en faite) mais à la c++ (d'où les foncteurs)

    Dites moi si c'est possible déjà et après si vous pouvez m'aiguiller ça serait cool. Merci

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    L'idée est qu'il faut travailler avec... des pointeurs de fonctions (des "Callbacks" en somme )

    Tu devrais trouver, en effectuant une recherche sur le forum avec ce terme (callback), un tas de sujets qui devraient te permettre de t'en sortir
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Tu peux regarder du côté de boost.function, c'est déjà tout prêt à l'emploi :p

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Ou chez Loki

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Tu peux regarder du côté de boost.function, c'est déjà tout prêt à l'emploi :p
    Pas possible d'utiliser Boost (c'est pas moi qui choisit les bilbio déjà je m'autorise la STL et y en a qui font une drole de tête )

    Les recherches sur le forum me renvoi souvent à des problèmes très spécifique (DLL, ...) ou alors justement résolu à l'aide de boot.function

    En épluchant forum et tuto j'en suis quand même arriver à ça :
    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
    
    typedef int (*PtrFonct)();
    
    struct functor
    {
      std::string m_name;
      PtrFonct m_pf;
      functor(const string &name, PtrFonct pf) : 
      m_name(name),m_pf(pf){};
    
      PtrFonct operator () ()
      {
        return (*m_pf)();
      }
    };
    /*...*/
      A a;
      functor f("methode1",&(PtrFonct)a.methode1);
      vector<functor> vect_f;
      vect_f.push_back(f);
      (*vect_f[0])();
    Mais j'ai cette erreur :
    error C2440: 'return' : cannot convert from 'int' to 'int (__cdecl *& )(void)

    Ce mixte C - C++ m'éffraye un peu
    Ou chez Loki
    connait pas

  6. #6
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Ok.
    Erreur résolue avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        return &(PtrFonct)(*m_pf)();
    et maintenant ça compile (éxécution par encore testée).
    Me reste toujours le sentiment de mélanger pointeurs de fonction à la C et foncteur à la C++

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Patatras Access Violation à l'éxécution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      A a;
      functor f("methode1",&(PtrFonct)a.methode1());
      vector<functor> vect_f;
      vect_f.push_back(f);
     
      /*...*/
     
      functor pf = vect_f[0];
      std::cout<<pf.m_name<<endl;
      pf();
    J'affiche bien "methode1" dans la console mais l'access violation est sur la ligne uivante lors de l'appel pf();

Discussions similaires

  1. Utilisation des vecteurs
    Par EmilieG dans le forum MFC
    Réponses: 12
    Dernier message: 19/03/2004, 16h28
  2. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40
  3. Récuperer les coordonnées d'un vecteur
    Par kerzut dans le forum OpenGL
    Réponses: 5
    Dernier message: 15/04/2003, 11h51
  4. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40
  5. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15

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