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 :

surcharge d'une fonction par une methode


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut surcharge d'une fonction par une methode
    Bonjour à tous,

    Malgré mes recherches, je n'ai pas trouvé la solution précise à mon problème. J'ai bien trouvé quelques pistes s'en rapprochant, mais je ne les ai pas très bien comprises.

    Mon but est d'implémenter une méthode random "static int random(int)", privée, à l'intèrieur de ma classe "MyObject". Cette méthode utilise la fonction random "long random()" de la librairie standard.

    voila le code:

    MyObject.h

    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
     
    #ifndef MYOBJECT_H_
    #define MYOBJECT_H_
     
    class MyObject
    {
     private:
      int   _id;
     
     public:
      MyObject();
     
     private:
      static int    random(int);
    };
     
    #endif  // MYOBJECT_H_
    MyObject.cpp


    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
     
    #include <stdlib.h>
    #include "MyObject.h"
     
    MyObject::MyObject()
    {
      // appel de la methode MyObject::random
      _id = random(42);
    }
     
    int     MyObject::random(int max)
    {
      // appel de la fonction random de la lib standard
      return ((int)(random() % max));
    }
    main.cpp (sait-on jamais :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MyObject.h"
     
    int             main(void)
    {
      MyObject      foo();
      return (0);
    }
    Qui me donne le message d'erreur suivant à la compil' :

    > In static member function `static int MyObject::random(int)':
    > error: no matching function for call to `MyObject::random()'
    > note: candidates are: static int MyObject::random(int)


    Je n'ai pas trouvé la manière de dire que la fonction qui doit être appelée, est celle de la librairie standard et non la méthode. La signature de la fonction ne suffisant apparement pas.

    Merci d'avance pour votre aide

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Points : 60
    Points
    60
    Par défaut
    Bonjour, la fonction random de la lib standart n'est-elle pas plutôt rand() ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par omc24 Voir le message
    Bonjour, la fonction random de la lib standart n'est-elle pas plutôt rand() ?
    Je ne crois pas, mais je me trompe peut être. Toujours est-t-il que je veux bien utiliser la fonction random() -> (cf man 3 random).

  4. #4
    Membre éclairé Avatar de seeme
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    430
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 430
    Points : 791
    Points
    791
    Par défaut
    Avec un #include <cstdlib> ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par seeme Voir le message
    Avec un #include <cstdlib> ?
    Toujours pas, même problème. Dommage.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Points : 60
    Points
    60
    Par défaut
    Heu... Je persiste...
    Mieux vaut utiliser rand(), qui est le "portage" C++ de random() de la libc.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par omc24 Voir le message
    Heu... Je persiste...
    Mieux vaut utiliser rand(), qui est le "portage" C++ de random() de la libc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <cstdlib>
    #include <iostream>
     
    int     main(void)
    {
      std::cout << random() << std::endl;
      return (0);
    }
    Chez moi ca marche, et c'est bien cette fonction que je veux utiliser. Même si rand() existe aussi, ca ne résoud pas mon problème .

    EDIT: je n'avais pas vu ton édit, oui tu as raison. Mais c'est quand même random() que je veux utiliser. Ou si tu préfères, le problème est le même si ma méthode s'appelle MyObject::rand() :p

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 48
    Points : 60
    Points
    60
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <cstdlib>
    #include <iostream>
     
    int main () 
    {
      std::cout << rand() << std::endl;
      return 0;
    }
    Chez moi ça marche, mais effectivement ça ne résoudrait pas ton problème . Typiquement tu as besoin des namespaces, cela permet justement d'éviter les conflits de nommage.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Il me semble que la classe rempli déjà ce rôle dans le cas de mon exemple. Non?

  10. #10
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour,

    Je n'ai pas trouvé la manière de dire que la fonction qui doit être appelée, est celle de la librairie standard et non la méthode
    il n'y as pas de random() dans la std. Mais bien std::rand().
    cf : <cstdlib>

    Pour le code de ton main retire les parenthèses à ton foo, sinon tu dois avoir un avertissement sous visual studio du type:
    warning C4930: 'MyObject ff(void)' : fonction prototypée non appelée (était-ce la définition de variable souhaitée ?)
    Et ton objet ne sera pas crée.
    Homer J. Simpson


  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Bonjour,

    il n'y as pas de random() dans la std. Mais bien std::rand().
    cf : <cstdlib>
    Je parlais bien de random (man 3 random), et le problème reste le même. cf les messages si dessus.

    Citation Envoyé par Astraya Voir le message
    Pour le code de ton main retire les parenthèses à ton foo, sinon tu dois avoir un avertissement sous visual studio du type:
    Et ton objet ne sera pas crée.
    Certes, mais tout le monde n'utilise pas visual

  12. #12
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    random (man 3 random)
    C'est du standard C et pas du standard C++ ici:
    /* Copyright (C) 1991-2003,2004,2005,2006 Free Software Foundation, Inc. This file is part of the GNU C Library.
    et
    http://en.wikipedia.org/wiki/Stdlib.h

    En standard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <cstdlib>
     
    std::rand();
    Standard c++ : http://www.cplusplus.com/reference/clibrary/cstdlib/

    Quel compilateur utilises tu?
    Homer J. Simpson


  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Astraya Voir le message
    C'est du standard C et pas du standard C++
    Oui. Je sais, mais c'était un exemple. Si tu préfères, changes mon exemple en remplacant la méthode random(int) par rand(int) et la fonction appelée par rand(). Mon problème reste le même.

    Citation Envoyé par Astraya Voir le message
    Quel compilateur utilises tu?
    gcc/g++. Mais là encore, je ne vois pas le rapport.

  14. #14
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Il faut probablement lever l'ambigüité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int MyObject::random(int max)
    {
      // appel de la fonction random de la lib standard
      return ((int)(::random() % max));
    }
    :: permet d'indiquer au compilateur qu'il doit chercher random() dans le namespace global.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Il faut probablement lever l'ambigüité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int MyObject::random(int max)
    {
      // appel de la fonction random de la lib standard
      return ((int)(::random() % max));
    }
    :: permet d'indiquer au compilateur qu'il doit chercher random() dans le namespace global.
    Merci, c'est tout à fait ce que je cherchais. Ca compile et ca marche.

  16. #16
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    gcc/g++. Mais là encore, je ne vois pas le rapport.
    Car cela compile sur mon compilateur.

    Oui. Je sais, mais c'était un exemple. Si tu préfères, changes mon exemple en remplacant la méthode random(int) par rand(int) et la fonction appelée par rand(). Mon problème reste le même.
    En C++ pour éviter justement les ambiguïté du ::random du C, la namespace standard à été créer, Il te faut mettre std::rand(). Ici aussi cela compilera et sera standard C++ et non du mélange C/C++.

    A bon entendeur.
    Homer J. Simpson


  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Astraya Voir le message
    En C++ pour éviter justement les ambiguïté du ::random du C, la namespace standard à été créer, Il te faut mettre std::rand(). Ici aussi cela compilera et sera standard C++ et non du mélange C/C++.
    Je comprends mieux avec ces précisions. Cependant, je cherchais la réponse à cet exemple précis, avec l'utilisation de random() et je ne connaissais pas la possibilité d'utiliser le "::" de cette manière.

    Sinon j'aurais effectivement pu utiliser std::rand() ou plus simplement changer le nom de ma méthode

    Merci pour les précisions.

  18. #18
    Membre régulier Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Points : 74
    Points
    74
    Par défaut
    Je n'ai pas eu le temps de lire tous les messages alors peut-être que je répète une solution.

    Deux points sont à considérer dans ton code qui génère des messages d'erreur :
    1) Tu as oublier dans le fichier ".cpp" de mettre le mot clé 'static' alors que tu as déclaré la fonction 'random' comme ceci : static int random dans le fichier d'entête.

    2) C'est la fonction 'rand' du standard qu'il faut utiliser. Tu utilises la fonction 'random' qui est ta propre fonction donc il y a un appel récursif extrêmement dangereux.

    Conclusion :
    Les messages d'erreurs sont générés seulement parce que tu as oublié le mot clé 'static' dans le fichier source et non par la fonction 'random' qui existe bien puisque c'est celle que tu as créée.
    Le bonheur est sans raison

  19. #19
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    1/ random() vient de POSIX, pas de C ni de C++.
    2/ pour reduire l'intervalle, voir la FAQ (ou la FAQ C, je sais plus)
    3/ meme probleme que quand on ne trouve pas la definition d'une fonction dans une classe de base quand on a surcharge le nom dans une classe derivee: les classes sont des portees et quand on cherche les definitions d'un identificateur, on s'arrete a la premiere portee qui le fournit, donc ici la classe et on ne va pas voir dans le namespace global. Pour utiliser celle du namespace global, il faut donc le qualifier: ::random().
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #20
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    random() vient de POSIX, pas de C ni de C++.
    pourrais tu m'éclaircir se point s'il te plais? je n'ai pas l'habitude de travailler avec C et donc je ne connais pas trop ses librairies. POSIX est une libraire de C et pas du standard?
    Homer J. Simpson


+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. [Debutant] changer des images dans une div par une fonction javascript
    Par raul_le_vieux dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/06/2007, 09h35
  3. Réponses: 13
    Dernier message: 09/04/2007, 13h20
  4. [VBA]Affectation d'une valeur à une cellule par une fonction
    Par lallougri dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/02/2006, 14h24
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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