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++Builder Discussion :

Membres statiques d'une classe et erreur de linkage


Sujet :

C++Builder

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut Membres statiques d'une classe et erreur de linkage
    Bonjour à tous,

    je suis confronté à un problème avec les membres static de ma classe.

    J'ai par exemple ceci dans ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       private:
             /** Instance de gs */
          static void *gs_instance;
    J'utilise ce membre dans des méthodes statiques de ma classe. Toutes mes méthodes et attributs sont statique.

    Cependant j'obtient l'erreur de linkage suivante :
    [Lieur Erreur] Unresolved external 'GSLoader::gs_instance' referenced from maclass.obj
    J'avoue ne pas trop comprendre, quelqu'un peut il m'expliquer le problème ?

    Merci beaucoup d'avance !
    Neilos

  2. #2
    mat.M
    Invité(e)
    Par défaut Re: Membres statiques d'une classe et erreur de linkage
    Citation Envoyé par Neilos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       private:
             /** Instance de gs */
          static void *gs_instance;
    J'utilise ce membre dans des méthodes statiques de ma classe. Toutes mes méthodes et attributs sont statique.
    Si c'est une méthode c'est une fonction incorporée à une classe chez moi
    static void *gs_instance() ne serait pas mieux ?
    Parce que là c'est un void pointeur qui est déclaré

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Non non c'est bien un attribut....
    Neilos

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Oui mais pour moi tu as déclaré un pointeur pas une méthode , je me trompe ?
    S'il y a Unresolved External c'est que le corps de gsInstance n'est déclaré nul part si c'est une méthode ou si c'est un pointeur il n'est défini nul part.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Je crois qu'on ne se comprend pas bien.

    C'est bien un pointeur...d'ailleurs si c'est un attribut ça ne peut pas être une méthode....

    En quoi cela t'embête il que ce soit un attribut et non une méthode ?
    Neilos

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Neilos
    Je crois qu'on ne se comprend pas bien.

    C'est bien un pointeur...d'ailleurs si c'est un attribut ça ne peut pas être une méthode....

    En quoi cela t'embête il que ce soit un attribut et non une méthode ?
    Attention, chez moi une méthode d'une classe c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class MaClasse(){
    MaClasse() ;//constructeur
    void Methode1(); // avec parentheses 
    };
    Puis aprés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void MaClasse::Methode1()
    {
     
     
     
    }
    En quoi cela t'embête il que ce soit un attribut et non une méthode
    ?
    Tu semblais parler de méthode précédemment

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Tout à fait d'accord avec toi sur la définition de méthode...mais elle ne s'applique pas qu'à toi c'est le vocabulaire du monde objet

    Je crois que tu n'as vraiment pas compris ma question. Mon problème se situe au niveau de l'erreur de linkage : je ne comprend pas pourquoi je l'ai. J'ai des erreurs de linkage sur les attributs statiques et non sur les méthodes statiques.

    Cependant ces attributs sont utilisés dans les méthodes statiques ce qui en soi ne devrait pas poser de problème...
    Neilos

  8. #8
    mat.M
    Invité(e)
    Par défaut
    Voilà un élément de réponse

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/html/_pluslang_static_member_functions.asp


    Static Member Functions
    Static member functions are considered to have class scope. In contrast to nonstatic member functions, these functions have no implicit this argument; therefore, they can use only static data members, enumerators, or nested types directly. Static member functions can be accessed without using an object of the corresponding class type. Consider this example:

    class WindowManager
    {
    public:
    static int CountOf(); // Return count of open windows.
    void Minimize(); // Minimize current window.
    WindowManager SideEffects(); // Function with side effects.
    ...
    private:
    static int wmWindowCount;
    };
    int WindowManager::wmWindowCount = 0;

    ...

    // Minimize (show iconic) all windows
    for( int i = 0; i < WindowManager::CountOf(); ++i )
    rgwmWin[ i] .Minimize();

    In the preceding code, the class WindowManager contains the static member function CountOf. This function returns the number of windows open but is not necessarily associated with a given object of type WindowManager. This concept is demonstrated in the loop where the CountOf function is used in the controlling expression; because CountOf is a static member function, it can be called without reference to an object.

    Static member functions have external linkage. These functions do not have this pointers (covered in the next section). As a result, the following restrictions apply to such functions:

    They cannot access nonstatic class member data using the member-selection operators (. or >).


    They cannot be declared as virtual.


    They cannot have the same name as a nonstatic function that has the same argument types.
    Note The left side of a member-selection operator (. or >) that selects a static member function is not evaluated. This can be important if the function is used for its side effects. For example, the expression SideEffects().CountOf() does not call the function SideEffects.
    Donc quelque part dans le code, de manière déportéeil faut déclarer
    void *MaClasse::gs_instance;


  9. #9
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Neilos
    Je crois que tu n'as vraiment pas compris ma question. Mon problème se situe au niveau de l'erreur de linkage : je ne comprend pas pourquoi je l'ai. J'ai des erreurs de linkage sur les attributs statiques et non sur les méthodes statiques.
    Si j'ai parfaitement compris la question ; l'attribut membre de la classe est mal définit !
    Voir l'exemple donné ci-dessous

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Effectivement tu as raison il faut déclarer les attributs statiques aussi en dehors de la classe.

    Merci beaucoup pour ton aide !
    Neilos

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2008, 18h23
  2. Réponses: 0
    Dernier message: 25/07/2007, 14h47
  3. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  4. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

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