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èmes avec membres statiques


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut Problèmes avec membres statiques
    Hello,

    Je veux dans une de mes classes déclarer et utiliser une classe issue d'une API.

    Une donnée membre est une instance de cette classe, et une fonction membre est une fonction get() pour accéder à cette donnée membre.

    Voici donc ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class A
    {
    public:
        ...
        B objetB;
        B* getObjetB();
         void une_fonction();
    };
     
    void A::une_fonction()
    {
        objetB.methode();
    }
    Visual C++ me sort alors l'erreur de compilation suivante :

    error C2228: la partie gauche de 'methode' doit avoir un class/struct/union

    Si je déclare objetB comme statique, je n'ai pas d'erreur de compilation (pourquoi, d'ailleurs ?), mais une erreur de liaison :

    error LNK2001: symbole externe non résolu "public: static class B A::objetB"

    En revanche, si je déclare objetB en tant que variable globale (et non comme une composition), cela fonctionne.

    Ma connaissance du mot-clé static est peut-être limitée.
    Pour moi, cela signifie dans le cas d'une donnée membre que sa valeur est commune est commune à toute les instances (et non dupliquée), et accessible sans instanciation, et pour une fonction membre (également accessible sans instanciation), qu'elle ne peut utiliser que des données membres statiques.

    Mais peut-être ai-je loupé quelque chose...

    Merci.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Points : 413
    Points
    413
    Par défaut
    Salut,

    la classe B est elle bien définie avant la classe A ?
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Frifron Voir le message
    la classe B est elle bien définie avant la classe A ?
    Je dirais même plus, les deux erreurs semblent indiquer que ta classe B n'est pas définie du tout.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Effectivement, ça m'est venu en allant chercher mon sandwich.

    J'ai rajouté

    ...et ça fonctionne.

    J'ai été troublé par elf ait que ej savais que B était une classe stattique, et que je pouvais donc me passer de cette définition.

  5. #5
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par oodini Voir le message
    J'ai rajouté

    T'as mis ça où? Peux-tu placer ton code mis à jour par rapport à ton premier post?
    Ca m'intéresse
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Le code que j'avais initialement mis était dans A.h.

    La ligne en question a été rajoutée au début de A.cpp.

  7. #7
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    OK. Il faut donc instancier l'objet statique au début de l'exécution, et non pas seulement à l'instanciation de la classe.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  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
    Citation Envoyé par oodini Voir le message
    Visual C++ me sort alors l'erreur de compilation suivante :

    error C2228: la partie gauche de 'methode' doit avoir un class/struct/union
    Ce problème est normalement lié au fait que B n'est pas défini avant A. Tu devrais avoir quelque chose du genre:
    A.H:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include "B.h"
    class A
    {
    public:
        ...
        B objetB;
        B* getObjetB();
         void une_fonction();
    };
    D'après ce que tu décris, je soupçonne que tu ais quelque chose de ce gout là:
    A.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
    public:
        ...
        B objetB;
        B* getObjetB();
         void une_fonction();
    };
    A.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "A.h"
    #include "B.h"
     
    void A::une_fonction()
    {
        objetB.methode();
    }
    Il faudrait basculer to include de b.h dans a.h.

  9. #9
    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 oodini Voir le message
    Ma connaissance du mot-clé static est peut-être limitée.
    Pour moi, cela signifie dans le cas d'une donnée membre que sa valeur est commune est commune à toute les instances (et non dupliquée), et accessible sans instanciation, et pour une fonction membre (également accessible sans instanciation), qu'elle ne peut utiliser que des données membres statiques.

    Mais peut-être ai-je loupé quelque chose...

    Merci.
    Pas trop si ce n'est qu'on peut (en jouant un peu sur les mots) dire que ta variable statique est 'instanciée' dans le cpp (ton rajout de B A::objetB.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 704
    Points
    2 704
    Par défaut
    Non, c'était simplement dû à une absence de définition du membre statique enb début du fichier .cpp.

    Sinon, je suis en train d'essayer de résoudre le même genre de problème, avec un membre templatisé. Apparemment, c'est moins simple à résoudre...

Discussions similaires

  1. Réponses: 17
    Dernier message: 03/06/2008, 13h19
  2. Problème avec fonction statique
    Par bbarate dans le forum C++
    Réponses: 3
    Dernier message: 23/04/2008, 16h29
  3. Problème avec inscription membre
    Par covin85 dans le forum Langage
    Réponses: 20
    Dernier message: 19/04/2006, 20h50
  4. [Tableaux] problème avec espace membre
    Par ph_anrys dans le forum Langage
    Réponses: 10
    Dernier message: 01/03/2006, 17h26
  5. [Debutant] Problème avec des membres static
    Par Mathieu.J dans le forum Débuter
    Réponses: 4
    Dernier message: 24/08/2005, 17h09

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