/ Membres de la classe / static const - c ++, static, global-variables, const

membres de la classe const statique - c ++, static, global-variables, const

J'ai diverses constantes auxquelles je dois faire référence tout au long de mon programme. Plutôt que d’utiliser des variables globales, j’ai utilisé des membres statiques de la classe const:

class Human
{
public:
static const int HANDS = 2;
static const int FINGERS = 10;
};

Le problème est que je dois lire la valeur à partir d'un fichier de données XML. Je sais que je peux initialiser un membre statique avec une fonction:

const int Human::HANDS = ReadDataFromFile();

Comme l'ordre d'initialisation ne peut être prédit que dans la même unité de compilation, je dois tous les définir dans le même fichier CPP. Ce n'est pas vraiment un problème mais ça devient un peu encombré.

Le vrai problème est que tout dans maLa fonction ReadDataFromFile () doit être prête à être utilisée avant même que mon code ait une chance de s'exécuter. Par exemple, j'ai une classe XML qui gère normalement la lecture de données XML à partir de fichiers. Cependant, je ne peux pas l’utiliser dans ce cas, car les membres statiques sont initialisés avant même la construction de mon objet de classe XML.

Mis à part les variables globales aléatoires partout, existe-t-il une meilleure solution pour organiser les constantes?

Réponses:

5 pour la réponse № 1

Votre fichier XML doit être lu lorsque vous essayez d'initialiser la variable. Cependant, vous pouvez le récupérer en utilisant un static objet à l'intérieur d'une fonction:

XMLData const& access_config_file() {
static XMLData data = readXMLData();
return data;
}

Vous pouvez ensuite référencer access_config_file() d'où que vous ayez besoin d'y accéder et d'extraire les valeurs. le static La variable est initialisée lors du premier appel de la fonction.


3 pour la réponse № 2

Faites de votre objet de classe XML un membre statique de cette classe également. c'est à dire.,

class Human
{
public:
static XMLReader x;
static const int HANDS;
static const int FINGERS;
};

Ensuite, dans le fichier d’implémentation, vous fournissez les définitions de ces membres statiques, c.-à-d.,

XMLReader Human::x();
const int Human::HANDS= x.ReadDataFromFile();
const int Human::FINGERS =x.ReadDataFromFile();