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 :

variable globale "interclasses"


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Par défaut variable globale "interclasses"
    Bonjour,

    Petite question de pure programmation : comment partager des variables entre plusieurs classes (contenues dans différents fichiers) ?

    J'avais pensé à mettre mes déclarations avec le mot clé extern dans un .h que j'inclus dans chaque .cpp interessé, mais j'ai des erreurs...

    Quelle est la meilleure démarche à suivre dans ces cas là ?

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En C++, on evite autant que possible les variables globales.

    Sinon, voir la FAQ C

    http://c.developpez.com/faq/c/?page=...TYPES_globales

  3. #3
    Sh.
    Sh. est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Par défaut
    pourquoi les évitons nous ??

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je pense qu'avec un peu de recherche tu pourrais trouver tout un tas de débats sur le sujet, et pas plus loin que sur ce forum.

  5. #5
    Sh.
    Sh. est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Par défaut
    ouais, mais je vais tomber sur des trolls ? :p
    =

  6. #6
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut
    variables globales ==> les fonctions qui les utilisent ne sont plus réentrantes, pb d'accès concurrents en multithread, dépendances des modules par rapport à ces variables (si on change le nom d'une variable globale, il faut revoir tout le code) etc,...

    si vraiment te ne peux pas faire autrement (ce qui m'étonerait) tu peux faire comme ceci pour limiter leur porté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // VariablesGlobales.h ------------------
    class VariablesGlobales
    {
        friend class A;
        friend class B;
    private:
        static int uneVariableGlobale;
        static double uneAute;
    };
     
    // VariablesGlobales.cpp -----------------
    #include "VariablesGlobales.h"
    int    VariablesGlobales::uneVariableGlobale = 0;
    double VariablesGlobales::uneAutre = 0.0;
    mais c'est de la bidouille

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Ou faire dériver d'une meêm classe qui donne accès à la variable encapsulée:
    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
     
    class SharedData
    {
    protected:
        static int SharedVariable;
    };
    int SharedData::SharedVariable = 0;
     
    class A : public SharedData
    {
    };
     
    class B : public SharedData
    {
    };
    A et B ont accès à SharedData::SharedVariable.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 104
    Par défaut erreur de lien... et questions sur les classes MFC AppWizard
    Merci pour ces méthodes qui semblent plus propres... Mais j'ai toujours la même erreur de lien :

    IODlg.obj : error LNK2001: unresolved external symbol "private: static class CObjectGUI * * SharedData::objectsGUItab" (?objectsGUItab@SharedData@@0PAPAVCObjectGUI@@A)

    IODlg.obj : error LNK2001: unresolved external symbol "private: static int SharedData::objectsGUItab_i" (?objectsGUItab_i@SharedData@@0HA)
    Mon .h est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "objectGUI.h"
    #define MAX_OBJECTS_NB					255
     
    class SharedData
    {
        friend class CGui_testView;
        friend class CIODlg;
    private:
    	static CObjectGUI * objectsGUItab[MAX_OBJECTS_NB];
    	static int objectsGUItab_i;
    };
    et j'accède aux variables dans une fonction de la classe CIODlg comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SharedData::objectsGUItab[SharedData::objectsGUItab_i++]=attachedGUIObj;

    Bien sur j'ai essayé d'éviter les variables globales, mais je ne sais pas si c'est possible dans mon cas que je vais essayer de vous expliquer simplement :

    J'ai une application graphique créée avec MFC AppWizard dans laquelle je veux que l'utilisateur puisse placer des objets, les déplacer... Je veux donc placer mes objets dans un tableau de CBitmapButton. Il sont créés dans une classe en relation avec les dialog box demandant des informations avant la création, mais doivent être affichés grâce au OnDraw de la classe CGui_testView (mon nom de projet est gui_test). A moins qu'il y ai un autre moyen pour afficher ces fameux CBitmapButton dans "l'espace blanc central" de cette appli MFC ? Et donc le problème est que la classe CGui_testView est appelée avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	pDocTemplate = new CSingleDocTemplate(
    		IDR_MAINFRAME,
    		RUNTIME_CLASS(CGui_testDoc),
    		RUNTIME_CLASS(CMainFrame),      
    		RUNTIME_CLASS(CGui_testView));
    Il n'y a donc pas d'objet de type CGui_testView à partir duquel récupérer la valeur de certains membres ?


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  9. #9
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pour la manière d'utiliser les variables membres statiques, voir dans la FAQ C++.

  10. #10
    jmv
    jmv est déconnecté
    Membre chevronné Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Par défaut Re: erreur de lien... et questions sur les classes MFC AppWi
    Citation Envoyé par pi05
    Mon .h est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "objectGUI.h"
    #define MAX_OBJECTS_NB					255
     
    class SharedData
    {
        friend class CGui_testView;
        friend class CIODlg;
    private:
    	static CObjectGUI * objectsGUItab[MAX_OBJECTS_NB];
    	static int objectsGUItab_i;
    };
    Et le .cpp ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 01/05/2009, 16h35

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