Search code examples
c++global-variablesconstantsconfiguration-files

Proper implementation of global configuration


My goal is to have global constants in a C++ game I'm working on (to represent some graphics info and the like). My current implementation is to toss them all in a .h and include them everywhere. This works, except that every time I change a setting, the entire code base must be recompiled.

So, my next idea was to toss them in some configuration txt file and parse them in, that way no code is actually changed when settings change. The parser was simple enough, and I could put the values into the constants, but because the parser was a code block, the constants were no longer global.

Is there a good way to solve this? Perhaps some way to make them global despite being in a block or some way to avoid recompiling everything when changing settings?


Solution

  • Another way to do this would be to create a singleton class.

    #include <fstream>
    #include <map>
    #include <string>
    
    class ConfigStore
    {
    public:
        static ConfigStore& get()
        {
            static ConfigStore instance;
            return instance;
        }
        void parseFile(std::ifstream& inStream);
        template<typename _T>
        _T getValue(std::string key);
    private:
        ConfigStore(){};
        ConfigStore(const ConfigStore&);
        ConfigStore& operator=(const ConfigStore&);
        std::map<std::string,std::string> storedConfig;
    };
    

    Here the configuration is saved in a map, meaning as long as parseFile can read the file and getValue can parse the type there is no need to recompile the config class if you add new keys.

    Usage:

    std::ifstream input("somefile.txt");
    ConfigStore::get().parseFile(input);
    std::cout<<ConfigStore::get().getValue<std::string>(std::string("thing"))<<std::endl;