Initialisation J'ai lu récemment que Java arbore maintenant des blocs d'initialisation comme ce qui suit:propre syntaxe pour Changer Membre statique Comportement
class C {
public C() { /* Instance Construction */ }
static { /* Static Initialisation */ }
{ /* Instance Initialisation */ }
}
Je suis particulièrement intéressé par le bloc static
. Cela m'a fait penser au problème de l'ordre d'initialisation statique qui affecte beaucoup d'utilisateurs C++ novices, et aux solutions de contournement typiques, comme envelopper le membre statique dans une fonction gratuite ou en utilisant l'extension __attribute__((init_priority(n)))
de GNU.
Je cherche un moyen d'écrire une méthode qui s'appellera automatiquement pour initialiser les membres statiques d'une classe, que ce soit lors de la création de la première instance ou simplement au début du programme, pendant les phases statiques ordinaires initialisation
Jusqu'à présent, c'est le meilleur qui est venu à l'esprit:
class C {
private:
class Static {
public:
Static();
int i;
Foo foo;
};
public:
static Static statics;
// ...
};
C::Static::Static() : i(42), foo("bar") {}
C'est, envelopper tous les membres statiques dans une classe et créer une instance statique de cette classe, dont le constructeur sert d'initialisation statique fonction. Il est simple de modifier ceci pour instancier le membre statics
uniquement lorsqu'une instance est créée, et même pour assurer la destruction correcte des membres statiques.
Le problème avec ceci, bien sûr, est que C::foo
devient C::statics.foo
, ce qui n'est pas naturel. Y a-t-il un moyen de contourner la syntaxe maladroite ou existe-t-il une meilleure solution?
d'accord, si vous avez beaucoup de statique dans vos classes peut-être l'approche est fausse en premier lieu. –
+1 pour la dernière phrase sur la conception globale. –
Considérez cela comme une curiosité. Comme vous le dites, dans certaines situations, cela pourrait être utile. Le fait est que C++ offre au programmeur très peu de contrôle sur la durée de vie des instances statiques, et un idiome propre pour étendre ce contrôle ne peut pas nuire. –