Co to jest idiom C ++ równoważny statycznemu blokowi Java?
Mam klasę z niektórymi członkami statycznymi i chcę uruchomić jakiś kod, aby je zainicjować (załóżmy, że tego kodu nie można przekonwertować na proste wyrażenie). W Javie po prostu bym to zrobił
class MyClass {
static int myDatum;
static {
/* do some computation which sets myDatum */
}
}
Jeśli się nie mylę, C ++ nie zezwala na takie statyczne bloki kodu, prawda? Co powinienem robić zamiast tego?
Chciałbym rozwiązania dla obu następujących opcji:
Inicjalizacja ma miejsce, gdy proces ładuje się (lub gdy ładowana jest biblioteka DLL z tą klasą).Inicjalizacja ma miejsce, gdy instancja klasy zostanie po raz pierwszy utworzona.W przypadku drugiej opcji myślałem o:
class StaticInitialized {
static bool staticsInitialized = false;
virtual void initializeStatics();
StaticInitialized() {
if (!staticsInitialized) {
initializeStatics();
staticsInitialized = true;
}
}
};
class MyClass : private StaticInitialized {
static int myDatum;
void initializeStatics() {
/* computation which sets myDatum */
}
};
ale nie jest to możliwe, ponieważ C ++ (w tej chwili?) nie pozwala na inicjalizację niestałych elementów statycznych. Ale przynajmniej zmniejsza to problem statycznego bloku do statycznego inicjowania przez wyrażenie ...