Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 17/12/2012, 17h43   #1
mulfycrowh
Invité régulier
 
Inscription : janvier 2006
Messages : 155
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 155
Points : 8
Points : 8
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
mulfycrowh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 19h47   #2
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 296
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 296
Points : 2 118
Points : 2 118
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
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 19/12/2012, 08h24   #3
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 551
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 551
Points : 4 098
Points : 4 098
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 ?
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2012, 14h23   #4
Awakening
Membre du Club
 
Inscription : septembre 2010
Messages : 67
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 67
Points : 61
Points : 61
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.
Awakening est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 09h36   #5
3DArchi
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 631
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 631
Points : 12 159
Points : 12 159
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.
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 21h39   #6
moldavi
Membre Expert
 
Homme david
Responsable développement
Inscription : décembre 2003
Messages : 1 296
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 296
Points : 2 118
Points : 2 118
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
moldavi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 22h23   #7
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 551
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 551
Points : 4 098
Points : 4 098
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 ?
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 09h05   #8
3DArchi
Rédacteur/Modérateur
 
Avatar de 3DArchi
 
Inscription : juin 2008
Messages : 7 631
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 7 631
Points : 12 159
Points : 12 159
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.
__________________
Ressources proposées par 3DArchi.
Les fonctions virtuelles en C++.
3DArchi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h56.


 
 
 
 
Partenaires

Hébergement Web