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 № 1Podczas 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();