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 :

Problème avec une fonction non static


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut Problème avec une fonction non static
    Bonjour,

    Je suis entrain de faire un projet en C++ et j'ai un petit problème.

    En faite, j'ai deux fichiers .cpp (Ball.cpp et Golf.cpp) et je voudrais modifier une variable de la class Golf à partir de la class Ball.

    Voici le code de ma fonction de modification de ma variable qui est dans Golf.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Golf::setMouvement()
    {
    	mouvement = false;
    }
    Et voici l'appel de la fonction qui est dans Ball.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Golf::setMouvement();
    Le problème est que lorsque je compile, j'ai cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2352: 'Golf::setMouvement' : appel non conforme d'une fonction membre non static
    Si vous pourriez m'aider, ce serait gentil.

    Merci

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ta fonction n'est pas déclarée static. Il faut donc un objet pour l'appeler.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Quand je l'a déclare en static voici ce que cela me met comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error C2597: référence non conforme à un membre non static 'Golf::mouvement'

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Les fonction statiques sont des fonctions qui sont independante de toutes instances de classes. Donc, on ne peut l' utiliser qu' avec la sintaxe suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nom_classe::fonction_static();
    Pour une fonction non statique, il faut obligatoirement avoir une instance de cette classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nom_classe objet1;
    objet1.fonction_non_statique();

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Pourquoi quand je la déclare en static cela ne marche pas ?

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Fais nous voir la definition de la classe. Plus d' avantage de code, aidera à trouver plus rapidement une solution.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Alors voici la définition de setMouvement() dans le Golf.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static void setMouvement();
     
    bool mouvement;
    Voici le code de setMouvement() dans Golf.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Golf::setMouvement()
    {
    	mouvement = false;
    }
    Et voici l'appel de la fonction dans Ball.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Golf::setMouvement();

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Les données membres non statiques c'est comme les fonctions membres non statique. Il faut un objet pour y accéder.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Et si je peux pas utiliser d'objet est ce que vous auriez une autre solution pour que je puisse modifier ma valeur booléenne depuis ma class Ball.

  10. #10
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Je vois que ta fonction est definie dans golf.h comme une fonction statique et non une fonction membre d' une classe. De ce fait, tu n' as pas à utiliser golf::setmouvement().
    En fait, quand on declare une fonction statique, elle est visible seulement dans son fichier sources et nulle part ailleur.
    Si tu veux l' utiliser dans un autre fichier, enleve le static.

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    Je ne vois pas du tout comment faire.

    Aidez moi s'il vous plait.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Il faut déjà comprendre ce que sont membres et méthodes statiques...

    Il s'agit de membres ou de méthodes qui sont partagé(e)s par l'ensemble des instances de la classe, et qui peuvent même être utilisé(e)s sans qu'il n'y ait la moindre instance de la classe créée...

    En gros, il s'agit de variables et de fonctions globales, à ceci près qu'elles peuvent subir une restriction d'accès (selon l'indicateur d'accessibilité dans lequel elles se trouvent) et, le cas échéant, accéder à tous les membre de la classe dans laquelle elles sont déclarées.

    Cependant, comme cela ne dépend d'aucune instance de la classe en question, elle ne peut accéder, si on n'indique pas l'instance sur laquelle elle doit travailler, que sur les membres statiques (qui, eux-même, ne dépendent donc d'aucune instance pour exister)
    Ainsi, le code suivant est envisageable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Golf1
    {
        public:
            Golf1();
            ~Golf1();
            static void setMouvement();
        private:
            static bool mouvement;
    };
    void Golf1::SetMouvement()
    {
        mouvement=false;
    }
    Ou, si tu veux que ta méthode statique accède à un membre non statique de la classe, il faut lui fournir comme argument l'instance sur laquelle elle doit travailler sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Golf2
    {
        public:
            Golf2();
            ~Golf2();
            static void setMouvement(Golf2&);
        private:
            bool mouvement;
    };
    void Golf2::SetMouvement(Golf2& g)
    {
        g.mouvement=false;
    }
    Enfin, les méthodes et les membres statiques faisant, malgré tout, partie de la classe, il est aussi possible de les appeler depuis une instance particulière, en gardant malgré tout les restrictions ci-dessus en tête...

    On pourrait donc envisager un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        Golf1 g1;
        Golf2 g2;
        g1.setMouvement();  //agit exactement comme Golf1::setMouvement()
        g2.setMouvement(g2);//agit exactement comme Golf1::setMouvement(g2)
        /* ceci fonctionnerait aussi et appliquerait le comportement à g3
         * sans toucher à g2
         * Golf2 g3;
         * g2.setmouvement(g3); mais ca aurait de quoi surprendre :P
         */
        return 0;
    }
    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

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    En faite je ne peux pas créer un objet Golf car cela modifie toute mon application.

    Est que vous auriez une autre solution complètement différente qui me permettrait de modifier ma petite variable booléenne à partir de ma class Ball.

    Ce serait gentil si vous pourriez m'aider car la je ne vois pas du tout comment je peux continuer mon progamme.

    Merci

  14. #14
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Hé bien, dans ce cas, tu dois rendre ta variable booléenne statique...

    C'est, en gros, ce est fait avec la classe Golf1 de mon exemple
    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

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    J'ai bien essayé de mettre ma variable en static mais rien n'y fait, j'ai encore une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error LNK2001: symbole externe non résolu "public: static bool Golf::mouvement"

  16. #16
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Ca, c'est le coup classique d'un oubli d'initialisation de tes membres classiques...

    Un rapide coup d'oeil sur la page de la FAQ qui traite des membres statiques t'aurait surement apporté la réponse
    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

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 37
    Points : 13
    Points
    13
    Par défaut
    C'est bon ca marche merci beaucoup.

    C'était bien un problème de déclaration.

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    De définition, plutot, si l'on tiens à appeler un chat, un chat
    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

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

Discussions similaires

  1. problème avec une fonction javaScript
    Par volthur dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/05/2006, 18h04
  2. Problème avec une fonction utilisateur !
    Par nalou dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 20/04/2006, 17h06
  3. [debutant] get image avec une variable non static
    Par laguna dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2006, 15h57
  4. Problème avec une fonction et un array
    Par Neal Morse dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/08/2005, 12h04
  5. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33

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