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
Version imprimable
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
Bonjour.
Je te donne du code (fait sous Visual Studio) :
main.cpp :
extern.h :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(); }
class.h :Code:
1
2
3
4
5 #include "class.h" static Z A; static Z B; static Z C;
test.hCode:
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.cppCode:
1
2
3
4
5
6
7 class Test{ public: void FaireLeTest(); };
Avec ceci, les classes A, B et C sont utilisées dans main.cpp et 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(); }
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.
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 ?
Bonjour,
Pourrais tu préciser ce que tu voudrais faire ?
Il est possible que cet exemple t'aide :
Tu peux alors écrire quelque chose commeCode:
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) };
Qui affichera l'id avec lequel chacune des instances aura été construit.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; }
Salut,
S'il s'agit de faire
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.Code:
1
2
3
4 static TYPE A; static TYPE B; static TYPE C;
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.
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) :D :aie:
veut-il un singleton et donc un membre static ?
juste une méthode static ?
une déclaration extern ?
autre chose ?
Salut,
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.