статические члены класса модификатор const

у меня есть множество констант, которые мне нужно ссылаться на протяжении всей моей программы. Вместо использования глобальных переменных я использую статические члены класса const:

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

проблема в том, что мне нужно прочитать значение из файла данных XML. Я знаю, что могу инициализировать статический член с помощью функции:

const int Human::HANDS = ReadDataFromFile();

поскольку порядок инициализации может быть предсказан только в одном блоке компиляции, я должен определить их все в одном файле CPP. Это не совсем проблема, но она становится немного загроможденной.

реальная проблема заключается в том, что все в моей функции ReadDataFromFile() должно быть готово к использованию до того, как мой код даже будет запущен. Например, у меня есть класс XML, который обычно обрабатывает чтение XML-данных из файлов. Однако я не могу использовать его в этом случае, потому что статические члены инициализируются до того, как мой объект класса XML будет даже построен.

помимо случайных глобальных переменных везде, есть лучшее решение для организации констант?

2 ответов


при попытке инициализации переменной необходимо прочитать XML-файл. Тем не менее, вы можете получить его с помощью static объект внутри функции:

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

затем вы можете ссылаться access_config_file() оттуда, где вам нужно получить к нему доступ и вытащить значения. The static переменная инициализируется при первом вызове функции.


сделайте свой объект класса XML статическим членом в этом классе. т. е.

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

затем в файле реализации вы предоставляете определения этих статических членов, т. е.

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