Voici une tâche simple, simple: lire les paramètres de configuration à partir d'un fichier de configuration, enregistrez les paramètres (par exemple en tant que hachage) dans un objet, accédez à cet objet à partir de divers objets qui doivent accéder aux paramètres de configuration.
J'ai trouvé. Cette implémentation pour la mise en œuvre de la classe ConfigFile et fonctionne. Ma question est la suivante: quelle est la meilleure façon de faire une instance de cette classe disponible à partir de mes autres classes et d'être un fil de sécurité, évitez les fiasco d'ordre d'initialisation statique, etc. p>
Mon approche actuelle consiste à le construire dans la principale () Utilisation p> puis apporter des paramètres Ceci doit être une tâche aussi courante que je pense qu'il doit y avoir un bon moyen de le faire généralement? J'apprécierais que quelqu'un me pointe dessus. P> merci,
C P> p>
6 Réponses :
Avez-vous regardé Options de programme de Boost une bibliothèque? p>
La bibliothèque de Boost Po gère les options de programme de ligne de commande, ma question concerne les options de configuration à lire à partir d'un fichier.
Ce que j'ai fait pour ma classe de configuration consiste à créer une classe statique singleton avec un cache de hashtable. Mon fichier de configuration est conçu pour être lu et écrit pour changer les paramètres d'application. P>
Chaque fois qu'un appel est effectué pour tirer un réglage, j'effectue une recherche sur la haquetable, si ce n'est pas là, j'ai lu le réglage du fichier, verrouillez la haquetable et placez-la dans la haquetable. La hache très rapide pour les recherches. P>
Je suis d'accord avec Chris, utilisez un singleton. La bonne chose à propos du modèle singleton est que cela n'initialise / rassemble uniquement les données dont vous avez besoin la première fois que vous essayez d'y accéder, à partir de là, il est disponible pour tout le monde intéressé. Si vous allez permettre à la configuration de changer, vous voudrez verrouiller l'écrivain. P>
Si vous voulez rouler - votre propre, je vous recommanderais d'utiliser le modèle de conception singleton pour votre classe de configuration. Demandez à la classe elle-même stocker un pointeur statique de son propre type et que le constructeur soit privé, il serait donc obligé d'utiliser le getter statique pour obtenir l'instance de la classe.
Donc, donc une maquette (qui peut ne pas compiler , a manquant la fonctionnalité de configuration amusante, mais il doit illustrer le point) p> au cas où je ne serais pas clair, le getconfig () regarderait m_configinstance. Si ce n'est pas valide, il en créerait un (a accès au constructeur privé) et le stockerait dans m_configinstance afin que chaque appel ultérieur accéderait à la même chose. P> Votre principale () Utilisez SetConfigFileName (), puis toute classe devra simplement appeler config :: getconfig (), puis appelez les opérations à ce sujet. Beaucoup plus propre qu'une variable globale standard. P> Blast - Dans le temps que j'ai passé à écrire ceci, d'autres personnes ont suggéré le modèle de conception singleton aussi. Ah bien - espérons que l'explication supplémentaire aide. P> p>
En mentionnant le "FIASCO d'ordre d'initialisation statique", je suppose que vous devez disposer d'éléments de configuration disponibles pour initialiser certains objets statiques. Une classe Singleton ConfigFile fonctionnera, mais vous devez modifier la façon dont vous obtenez le nom de fichier au fur et à mesure que les informations nécessaires avant le début principal (). Vous aurez besoin d'un autre singleton pour fournir le nom de fichier ou construire le nom de fichier dans la classe de configuration elle-même. P>
J'ai utilisé une technique similaire au modèle de conception singleton pour configurer des ressources globales comme celle-ci.
class Config { public: Config(const string & filename) { if (m_configInstance) { throw AlreadyInitException; } // do main init m_configInstance = this; } ~Config() { m_configInstance = 0; } static Config * getConfig() { if (!m_configInstance) { throw NoConfigException; } return m_configInstance; } private: static Config * m_configInstance; }; Config * Config * m_configInstance = 0;