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 :

Accéder à des instances statiques de classe


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 173
    Points : 42
    Points
    42
    Par défaut Accéder à des instances statiques de classe
    Bonjour,

    J'ai créé statiquement trois instances d'une classe Z : A B et C dans un fichier cpp.
    Comment accéder à ces trois instances à partir d'un autre cpp ?

    Merci

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Je te donne du code (fait sous Visual Studio) :

    main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "extern.h"
    #include "test.h"
     
    void main(){
     
    		A.Faire();
    		B.Faire();
    		C.Faire();
     
    		Test t;
    		t.FaireLeTest();
    }
    extern.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "class.h"
     
    static Z A;
    static Z B;
    static Z	C;
    class.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <Windows.h>
     
    class Z{
     
    public:
     
    		void Faire(){ MessageBox(NULL, L"Je fais", L"", MB_OK); }
     
    };
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Test{
     
    public:
     
    		void FaireLeTest();
     
    };
    test.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "test.h"
    #include "extern.h"
     
    void Test::FaireLeTest(){
     
    		A.Faire();
    		B.Faire();
    		C.Faire();
    }
    Avec ceci, les classes A, B et C sont utilisées dans main.cpp et test.cpp.

    J'ai déclaré les variables statiques dans un .h. Si je ne dis pas de bêtises, une variable déclarée statique dans un .cpp ne pourra être connue que dans ce même .cpp.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Je pense qu'il y a mecomprehension du langage et des mots-clés.
    Que veux-tu faire réellement ?
    Sais-tu vraiment comment s'utilise static ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Pourrais tu préciser ce que tu voudrais faire ?

    Il est possible que cet exemple t'aide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier z.h
    class Z
    {
        Z(int id) : mId(id) {}
    private:
        int id() const { return mId;}
    public:
        static Z A, B, C; // variables a initialiser dans un fichier .cpp (par exemple z.cpp)
    };
    Tu peux alors écrire quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "z.h"
    #include <iostream>
     
    int main(int argc, char *argv[])
    {
        std::cout << "id de l'instance A" << Z::A.id() << std::endl;
        std::cout << "id de l'instance B" << Z::B.id() << std::endl;
        std::cout << "id de l'instance C" << Z::C.id() << std::endl;
     
        return 0;
    }
    Qui affichera l'id avec lequel chacune des instances aura été construit.

  5. #5
    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 mulfycrowh Voir le message
    Bonjour,

    J'ai créé statiquement trois instances d'une classe Z : A B et C dans un fichier cpp.
    Comment accéder à ces trois instances à partir d'un autre cpp ?

    Merci
    Salut,
    S'il s'agit de faire
    Code fichier1.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    static TYPE A;
    static TYPE B;
    static TYPE C;
    Tu ne peux utiliser leur symbole 'A', 'B', ou 'C' dans une autre unité de compilation. Les symboles ne seront utilisables que dans l'unité de compilation où ils sont définis et tu devras passer par un intermédiaire (fonction par ex) pour y accéder depuis un autre fichier.

    Note que de telles variables globales vont présenter des problèmes communs aux singletons si récriés. Je te conseille la lecture du billet d'Emmanuel : Etes-vous atteint de Singletonite ?

    @moldavi : le fait de définir les variables static TYPE A; dans le fichier d'en-tête aboutit à créer une variable différente dans chaque fichier compilé incluant l'en-tête. Autrement dit, dans ton exemple main et Test::FaireLeTest adressent deux jeux de variables A,B et C différents.

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Autrement dit, dans ton exemple main et Test::FaireLeTest adressent deux jeux de variables A,B et C différents.
    Merci pour cette précision.

    A question naïve, réponse naïve.

    Evidemment, je ne vois pas d'intérêt à utiliser une classe static dans plusieurs cpp.

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par moldavi Voir le message
    Evidemment, je ne vois pas d'intérêt à utiliser une classe static dans plusieurs cpp.
    A vrai dire le problème n'est pas l'intérêt ou pas, mais l'incompatibilité/impossibilité.
    static signifie "unique dans l'unité de compilation", soit dans un .cpp donné
    donc vouloir utiliser quelque chose d'unique à un cpp dans d'autres cpp relève au mieux de la mécompréhension et du mauvais terme utilisé, au pire d'une incongruité neuronale (ou self mind-fuck)

    veut-il un singleton et donc un membre static ?
    juste une méthode static ?
    une déclaration extern ?
    autre chose ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  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
    Salut,

    Citation Envoyé par Bousk Voir le message
    static signifie "unique dans l'unité de compilation", soit dans un .cpp donné
    En fait static permet deux choses distinctes :

    => étendre la durée de vie d'une variable : une variable membre d'une classe ou une variable locale à une fonction déclarées static auront une durée de vie non plus limitée à celle du contexte l'englobant mais s'étendra de leur construction jusqu'à la fin du programme.

    => uniquement pour les variables globales d'une unité de compilation (variable ayant une 'portée d'espace de nom') , réduire la portée du nom à cette unité de compilation. Ceci peut aussi être atteint en utilisant un espace de nom anonyme.

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  2. Réponses: 7
    Dernier message: 28/12/2007, 23h08
  3. Réponses: 15
    Dernier message: 25/10/2007, 16h56
  4. Réponses: 9
    Dernier message: 18/10/2007, 20h06
  5. [VB.NET]Accéder à différentes instances d'une classe
    Par Cotte Cotte Coq dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/12/2006, 13h14

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