This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in204:cpp:syntax:class:static [2019/10/09 19:42] bmonsuez [Autre syntaxe d'initialisation des champs statiques] |
in204:cpp:syntax:class:static [2022/11/18 10:50] (current) |
||
---|---|---|---|
Line 128: | Line 128: | ||
static std::random_device m_seed; | static std::random_device m_seed; | ||
static std::mt19937 m_generator; | static std::mt19937 m_generator; | ||
- | <code> | + | </code> |
Pour ce faire, il suffit d'ajouter ''static'' devant. Cependant cela ne veut pas dire que les champs statiques sont créés et initialisés. Ils ne sont en fait que déclarés. Il faut ensuite les créer en dehors de la classe. | Pour ce faire, il suffit d'ajouter ''static'' devant. Cependant cela ne veut pas dire que les champs statiques sont créés et initialisés. Ils ne sont en fait que déclarés. Il faut ensuite les créer en dehors de la classe. | ||
Line 147: | Line 147: | ||
Enfin, la méthode ''get'' de ''RandomGenerator'' qui est marquée ''static'' peut elle aussi accédée au champ statique ''RandomGenerator::m_seed''. | Enfin, la méthode ''get'' de ''RandomGenerator'' qui est marquée ''static'' peut elle aussi accédée au champ statique ''RandomGenerator::m_seed''. | ||
+ | En fait malheureusement la situation n'est pas si simple. En effet, si la classe ''RandomGenerator'' est déclarée dans un fichier ''.hpp'', la déclaration : | ||
+ | |||
+ | <code cpp> | ||
+ | // Initialisation des champs ''statiques'' qui s'effectue en | ||
+ | // dehors de la classe. | ||
+ | |||
+ | RandomGenerator::m_seed; | ||
+ | RandomGenerator::m_generator(m_seed()); | ||
+ | </code> | ||
+ | |||
+ | ne peut pas être présente dans le fichier ''.hpp'', puisque ce fichier pourrait être chargée plusieurs fois de suite et dans ce cas, il existerait plusieurs entrées correspond à ''RandomGenerator::m_seed;''. Pour garantir qu'il ne soit généré qu'une seule entrée, il faut donc déclarer les champs dans le fichier ''.cpp'' associé au fichier ''.hpp'' pour garantir l'unicité de la déclaration. | ||
==== Autre syntaxe d'initialisation des champs statiques ==== | ==== Autre syntaxe d'initialisation des champs statiques ==== | ||
Line 168: | Line 179: | ||
static std::string message; | static std::string message; | ||
}; | }; | ||
+ | |||
+ | </code> | ||
+ | |||
+ | et soit dans le même fichier si la classe est déclarée dans un fichier ''.cpp'', soit dans le fichier ''.cpp'' associé au fichier ''.hpp'' dans lequel la classe est déclarée, vous ajoutez : | ||
+ | |||
+ | <code cpp> | ||
+ | |||
std::string Field::message = "A message"; | std::string Field::message = "A message"; | ||
+ | </code> | ||
</code> | </code> | ||
- | Par contre, cette nouvelle syntaxe impose que le type du chamo est défini avant la définition de la classe. Si ce n'est pas le cas et que le type est simplement annoncé mais non complètement défini, il sera nécessaire de procéder selon la méthode habituelle. | + | Par contre, cette nouvelle syntaxe impose que le type du champ est défini avant la définition de la classe. Si ce n'est pas le cas et que le type est simplement annoncé mais non complètement défini, il sera nécessaire de procéder selon la méthode habituelle. |
==== Les champs statiques désignant des constantes ==== | ==== Les champs statiques désignant des constantes ==== | ||
Line 190: | Line 209: | ||
</code> | </code> | ||
+ | |||
+ | ==== Le problème de l'initialisation des champs statiques ==== | ||
+ | |||
+ | L'initialisation des champs statiques est effectué unité de compilation par unité de compilation. Ceci signifie que tous les champs statiques présents dans une unité de compilation est effectivement initialisé avant d'être utilisé. Cependant, il se peut que si un code fait appel à un champ statique d'une classe défini dans une autre unité de compilation et que ce code est appelé avant, dans ce cas, le champ ne sera pas initialisé et donc une erreur se produira au moment du chargement. | ||