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 :

Ecriture de foreach, pb d'utilisation dans une autre classe


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 87
    Points : 90
    Points
    90
    Par défaut Ecriture de foreach, pb d'utilisation dans une autre classe
    Salut a tous,

    J'ai ecris dans une classe Ennemies qui est une liste d'EnnemieNode la fonction foreach suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Ennemies::forEach(void (* process)(Ennemie* ennemie)) {
         EnnemieNode* currentNode = firstEnnemie;
     
         while(currentNode!=NULL) {
              process( currentNode->getEnnemie() );
              currentNode = currentNode->getNext();
         }
    }
    Si j'utilise cette methode dans mon main de la facon suivante, ca fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    // methode utilisant un pointeur d'ennemie
    void manageEnnemie(Ennemie* ennemie) {
         if (player.isHeadTrash(ennemie)) 
                player + ennemie;  // j'ai surcharge le +...
    }
     
    //une ligne dans le main :
    ennemies.forEach(manageEnnemie);
    Cependant, lorsque je veux utiliser cette meme methode foreach dans une methode de classe, ca ne fonctionne pas. Le compilo me dit que j'ai passe un unknow type en parametre alors que la methode (le parametre passe a foreach) en question est declare dans le header et que son code est donne dans le fichier cpp et est compile. J'ai meme essaye de mettre cette methode publique.

    Un peu de code pour etre plus explicite :

    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
     
    // Dans le header de ScreenManager en publique :
     
    void displayEnnemie(Ennemie* ennemie);
     
    // dans screenManager.cpp :
     
    void ScreenManager::displayEnnemie(Ennemie* ennemie) {
         Organ* currentOrgan = ennemie->getHead();
     
         while (currentOrgan != NULL) {
               displayOrgan(currentOrgan);
               currentOrgan = currentOrgan->getNextOrgan();
         }  
    }
     
    // la methode qui utilise foreach :
     
    void ScreenManager::displayEnnemies(Ennemies* ennemies) {
         ennemies->forEach(displayEnnemie); // c'est la que ca plante
    }
    Merci par avance

  2. #2
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est parce que les fonctions membres n'ont pas la bonne signature.

    :
    http://c.developpez.com/faq/cpp/?pag...onction_membre

  3. #3
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 87
    Points : 90
    Points
    90
    Par défaut
    Merci, effectivement j'avais survole la faq trop rapidement...

    J'ai donc mis ca dans le header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void forEach(void (ScreenManager::* process)(Ennemie* ennemie));
    J'ai toujours la meme erreur... Le but est d'utiliser la methode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void ScreenManager::displayEnnemies(Ennemies* ennemies) {
         ennemies->forEach(displayEnnemie);
    }
    Je comprend franchement pas.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il me semble que pour les pointeurs vers fonctions membres en C++, le & est obligatoire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    On dirait bien que le nom de la classe est nécessaire aussi...
    Cet exemple minimal compile sous Visual :
    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
    class Ennemie;
    class Ennemies;
    class ScreenManager;
     
    class Ennemies
    {
    public:
    	void forEach(void (ScreenManager::* process)(Ennemie*));
    };
     
     
    class ScreenManager
    { 
    private:
    	void displayEnnemies(Ennemies* ennemies);
    	void displayEnnemie(Ennemie* ennemie);
    };
     
    //////////////////////////////////////////////////////////////////////////////
     
    void Ennemies::forEach(
     void (ScreenManager::* process)(Ennemie*)
     )
    {
    (void)process;
    }
     
    //////////////////////////////////////////////////////////////////////////////
     
    void ScreenManager::displayEnnemie(
     Ennemie* ennemie
     )
    {
    (void)ennemie;
    }
     
     
    void ScreenManager::displayEnnemies(
     Ennemies* ennemies
     )
    {
    ennemies->forEach(&ScreenManager::displayEnnemie);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 87
    Points : 90
    Points
    90
    Par défaut
    Merci beaucoup,

    l'appel de foreach et sa declaration dans le header fonctionnent.

    Par contre dans le corps de foreach, ca plante. Code et erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Ennemies::forEach(void (ScreenManager::* process)(Ennemie* ennemie)) {
         if (firstEnnemie != NULL) {
     
             EnnemieNode* currentNode = firstEnnemie;
     
             while(currentNode!=NULL) {               
                  process(currentNode->getEnnemie()); // j'ai aussi essaye (void)process
                  currentNode = currentNode->getNext();
             }
        }
    }
    76 C:\cours\c++\SnakeRun\ennemies.cpp must use .* or ->* to call pointer-to-member function in `process (...)'
    ScreenManager::* process
    Ca veut bien dire que process est un pointeur de fonction de ScreenManager?

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Mais un pointeur de fonction non-statique.
    Pour l'appeler comme ça, il faut que tu aies un ScreenManager à portée de main:
    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
    void Ennemies::forEach(
     ScreenManager * pSm,
     void (ScreenManager::* process)(Ennemie*)
     )
    {
         if(firstEnnemie != NULL) {
     
             EnnemieNode* currentNode = firstEnnemie;
     
             while(currentNode!=NULL) {               
                  pSm->process(currentNode->getEnnemie());
                  currentNode = currentNode->getNext();
             }
        }
    }
    PS: "Ça plante"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Fonction Protected utilisée dans une autre classe
    Par dinguedemoi dans le forum Langage
    Réponses: 17
    Dernier message: 13/07/2009, 09h28
  2. Réponses: 2
    Dernier message: 29/08/2007, 19h43
  3. Utilisation des méthodes de classe dans une autre classe
    Par ChriGoLioNaDor dans le forum C++
    Réponses: 4
    Dernier message: 28/07/2007, 15h10
  4. utiliser les attribut d'une classe dans une autre classe
    Par kaissaoui dans le forum Langage
    Réponses: 11
    Dernier message: 18/07/2007, 15h13
  5. Réponses: 3
    Dernier message: 25/12/2006, 20h45

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