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

MFC Discussion :

[MFC] enorme probleme entre statics et includes


Sujet :

MFC

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut [MFC] enorme probleme entre statics et includes
    Bonjour a tous, j'essaye de comprendre depuis plus d'une heure, et la vraiment je seche, alors je m'en remets à vos avis d'experts :

    Voila j'ai fais une classe toute bete, et je veux avoir 2 variables static. Voici son code que j'ai allégé au max :

    SaperaRessourcesInfos.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
     
    #ifndef _SAP_RESSOURCES_INFOS_H_
    	#define _SAP_RESSOURCES_INFOS_H_
     
    class CSaperaRessourcesInfos
    {
    	static unsigned short s_usSapRessourcecount;	//Nombre total de ressources sapera trouvées.
    	static int s_nSapServerCount;	
     
    };
     
    unsigned short CSaperaRessourcesInfos::s_usSapRessourcecount = 0; //Nombre total de ressources sapera trouvées.
    int CSaperaRessourcesInfos::s_nSapServerCount = 0; //Nombre total de serveurs sapera trouvés.
    #endif
    SaperaRessourcesInfos.ccp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #pragma once
    #include "stdafx.h"
    #include ".\saperaressourcesinfos.h"
     
    #pragma comment (lib, "cvcdriver.lib")
     
    CSaperaRessourcesInfos::CSaperaRessourcesInfos(void)
    {
    	InitProperties();
    	if(s_nSapServerCount==0)RetreiveSaperaServers();
    }
    Si je compile cette classe dans son coin , tout va bien.

    Maintenant voici mon probleme : Je fais une petite appli MFC de type CDialog et je veux inclure ma classe CSaperaRessourcesInfos et la quoi qu'il arrive j'ai des erreurs de lien, voici ce qu'il se passe :

    J'inclus ma classe dans le header ou meme le fichier source qui sert de point d'entré au programme (là où theApp est instancié). si je ne me trompe pas le #include "SaperaRessourcesInfos" ne devrait du coup etre fait QU'UNE SEULE fois non? et bien non j'obtient l'erreur suivante :
    iotest error LNK2005: "private: static int CSaperaRessourcesInfos::s_nSapServerCount" (?s_nSapServerCount@CSaperaRessourcesInfos@@0HA) already defined in GrabDemo.obj
    iotest error LNK2005: "private: static unsigned short CSaperaRessourcesInfos::s_usSapRessourcecount" (?s_usSapRessourcecount@CSaperaRessourcesInfos@@0GA) already defined in GrabDemo.obj
    Si quelqu'un pouvait m'expliquer le pourquoi du comment???
    Autre chose que je ne comprends pas. Regardez le header de ma classe, j'y utilise une astuce (visiblement mal) à savoir :

    #ifndef _SAP_RESSOURCES_INFOS_H_
    #define _SAP_RESSOURCES_INFOS_H_

    //mon ptit bazard
    #endif
    pour eviter tout probleme d'include, du coup je comprends encore moins pourquoi j'obtiens ces erreurs de lien. Si quelqu'un pouvait m'expliquer ce qui cloche dans tout ca, ca serait super sympa parceque la je m'arrache les cheveux !!!

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 887
    Points : 1 531
    Points
    1 531
    Par défaut Re: [MFC] enorme probleme entre statics et includes
    Citation Envoyé par giova_fr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned short CSaperaRessourcesInfos::s_usSapRessourcecount = 0; //Nombre total de ressources sapera trouvées.
    int CSaperaRessourcesInfos::s_nSapServerCount = 0; //Nombre total de serveurs sapera trouvés.
    Ces deux lignes ne servent à rien, les variables statiques sont automatiquement initialisées à zéro. Et je pense que l'erreur de compilation vient aussi de ces deux lignes.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Hmmm mon livre sur le C++ dit tout le contraire, je cite :

    On pourrait penser qu'il est possible d'initialiser un membre statique lors de sa déclaration comme dans

    class toto
    {
    static int n = 2; //erreur
    };

    En fait, cela n'est pas permis car, compte tenu des possibilités de compilation séparée, le membre statique risquerait de se voir réserver différents emplacements dans differents modules objet.

    Un membre statique doit donc etre initialisé explicitement (à l'exterieur de la déclaration de la classe) par une instruction telle que :

    int toto::n=2;

    Cette démarche est utilisable aussi bien pour les membres statique publiques que privés

    Par ailleur contrairement à ce qui se produit pour une variable ordinaire, un membre statique n'est pas initialisé par defaut à zero.
    J'ajouterai à cette citation, si ce que tu dis est vrai, comment faire pour initialiser n à 2 sans instancier d'objet de la dite classe, simplement en incluant sa déclaration dans le code?

  4. #4
    Membre habitué

    Inscrit en
    Mai 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 132
    Points : 171
    Points
    171
    Par défaut
    Salut,

    C’est facile. Les deux linges il faut mettre a .cpp, pas a .h (les deux sont code, la déclaration de variable).


    Code :

    #pragma once
    #include "stdafx.h"
    #include ".\saperaressourcesinfos.h"

    #pragma comment (lib, "cvcdriver.lib")

    unsigned short CSaperaRessourcesInfos::s_usSapRessourcecount = 0; //Nombre total de ressources sapera trouvées.
    int CSaperaRessourcesInfos::s_nSapServerCount = 0; //Nombre total de serveurs sapera trouvés.


    CSaperaRessourcesInfos::CSaperaRessourcesInfos(void)
    {
    InitProperties();
    if(s_nSapServerCount==0)RetreiveSaperaServers();
    }


    Fredy

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2005
    Messages
    700
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 700
    Points : 488
    Points
    488
    Par défaut
    Hmmm en effet merci Freddy tu me sauve la mise, bon je m'embrouille encore bien avec ces histoire d'includes, faut absolument que je mettre la main sur un cours qui explique comment devenir maitre en la matiere.

    merci encore.

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

Discussions similaires

  1. [MFC]+[dll] probleme au linkage
    Par BainE dans le forum MFC
    Réponses: 3
    Dernier message: 22/06/2005, 12h04
  2. [MFC] la touche entrée
    Par Aradesh dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 12h07
  3. Réponses: 4
    Dernier message: 31/03/2005, 10h33
  4. [MFC][debutant] probleme pour déclarer une structure
    Par Robleplongeur dans le forum MFC
    Réponses: 10
    Dernier message: 21/02/2005, 13h29
  5. Réponses: 4
    Dernier message: 23/05/2004, 17h14

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