статические члены класса модификатор 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();