/ / statyczne elementy klasy const - c ++, static, global-variables, const

statyczne elementy klasy const - c ++, static, global-variables, const

Mam różne stałe, które muszę uwzględnić w całym moim programie. Zamiast używać zmiennych globalnych, używałem statycznych członków klasy const:

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

Problem polega na tym, że muszę odczytać wartość z pliku danych XML. Wiem, że mogę zainicjować statyczny element członkowski z funkcją:

const int Human::HANDS = ReadDataFromFile();

Ponieważ kolejność inicjowania można przewidzieć tylko w tej samej jednostce kompilacji, muszę zdefiniować wszystkie z nich w tym samym pliku CPP. To nie jest problem, ale robi się trochę zagracony.

Prawdziwym problemem jest to, że wszystko w moimFunkcja ReadDataFromFile () musi być gotowa do użycia, zanim mój kod będzie miał szansę zostać uruchomiony. Na przykład mam klasę XML, która normalnie obsługuje odczytywanie danych XML z plików. Nie mogę tego jednak użyć w tym przypadku, ponieważ statyczne elementy są inicjowane, zanim mój obiekt klasy XML zostanie nawet skonstruowany.

Pomijając przypadkowe zmienne globalne na całym świecie, czy istnieje lepsze rozwiązanie do porządkowania stałych?

Odpowiedzi:

5 dla odpowiedzi № 1

Podczas próby zainicjowania zmiennej należy odczytać plik XML. Możesz go jednak uzyskać za pomocą static obiekt wewnątrz funkcji:

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

Możesz wtedy odwołać się access_config_file() z dowolnego miejsca, do którego chcesz uzyskać dostęp i wyciągnij wartości. The static zmienna zostaje zainicjalizowana przy pierwszym wywołaniu funkcji.


3 dla odpowiedzi № 2

Uczyń również obiekt klasy XML statycznym członkiem tej klasy. to znaczy.,

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

Następnie w pliku implementacji podaje się definicje tych statycznych elementów, tj.

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