Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : janvier 2006
    Messages : 165
    Points : 10
    Points
    10

    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
    Expert Confirmé

    Homme Profil pro david
    Responsable développement
    Inscrit en
    décembre 2003
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Nom : Homme david
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 577
    Points : 2 752
    Points
    2 752

    Par défaut

    Bonjour.

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

    main.cpp :

    Code :
    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 :
    1
    2
    3
    4
    5
    #include "class.h"
     
    static Z A;
    static Z B;
    static Z	C;
    class.h :

    Code :
    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 :
    1
    2
    3
    4
    5
    6
    7
    class Test{
     
    public:
     
    		void FaireLeTest();
     
    };
    test.cpp

    Code :
    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.
    Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
    http://sourceforge.net/projects/mfnode/

    http://jeux.developpez.com/faq/directx/?page=dshow

  3. #3
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    1 889
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 1 889
    Points : 4 997
    Points
    4 997

    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 ?

  4. #4
    Membre du Club
    Inscrit en
    septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : septembre 2010
    Messages : 73
    Points : 63
    Points
    63

    Par défaut

    Bonjour,

    Pourrais tu préciser ce que tu voudrais faire ?

    Il est possible que cet exemple t'aide :
    Code :
    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 :
    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/Modérateur
    Avatar de 3DArchi
    Inscrit en
    juin 2008
    Messages
    7 636
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 7 636
    Points : 11 692
    Points
    11 692

    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 :
    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
    Expert Confirmé

    Homme Profil pro david
    Responsable développement
    Inscrit en
    décembre 2003
    Messages
    1 577
    Détails du profil
    Informations personnelles :
    Nom : Homme david
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : décembre 2003
    Messages : 1 577
    Points : 2 752
    Points
    2 752

    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.
    Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect
    http://sourceforge.net/projects/mfnode/

    http://jeux.developpez.com/faq/directx/?page=dshow

  7. #7
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    1 889
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 26
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 1 889
    Points : 4 997
    Points
    4 997

    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 ?

  8. #8
    Rédacteur/Modérateur
    Avatar de 3DArchi
    Inscrit en
    juin 2008
    Messages
    7 636
    Détails du profil
    Informations forums :
    Inscription : juin 2008
    Messages : 7 636
    Points : 11 692
    Points
    11 692

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •