Mam ten istniejący kod, w którym mają klasę i metodę inicjowania w tej klasie. Oczekuje się, że po utworzeniu obiektu klasy muszą one wywoływać na nim inicjalizację.
Powód, dla którego istnieje metoda inicjalizacji Obiekt jest tworzony wcześnie, aby mieć zasięg globalny, a następnie metoda inicjalizacji jest wywoływana później po załadowaniu biblioteki DLL, od której zależy.
Problem z inicjalizacją Klasa ma teraz ten inicjalizator bool, który należy sprawdzić w każdej metodzie przed kontynuowaniem i zwraca błąd, jeśli nie jest zainicjowany. Mówiąc najprościej, to duży ból.
Jedno możliwe rozwiązanie Zainicjuj w konstruktorze. Miej tylko wskaźnik do obiektu w zasięgu globalnym. Utwórz rzeczywisty obiekt po załadowaniu biblioteki dll.
Problem z powyższym rozwiązaniem Każdy, kto utworzy obiekt tej klasy, musi wiedzieć, że należy go utworzyć dopiero po załadowaniu biblioteki dll, w przeciwnym razie zakończy się niepowodzeniem.
Czy to jest dopuszczalne?
call_once
w C ++ 11 . Projekty, które nie są jeszcze w C ++ 11, powinny zbadać, w jaki sposób call_once jest zaimplementowane w C ++ 11 (skup się na tym, jaki problem rozwiązuje, a następnie jak), a następnie ponownie zaimplementuj go w (starym) smaku C ++. Potrzebuje wielowątkowej operacji podstawowej bezpiecznej synchronizacji, której stan musi zostać zainicjowany statycznie (o stałej wartości). Należy pamiętać, że kompilatory w wersjach wcześniejszych niż C ++ 11 mogą mieć inne osobliwości, które należy spełnić.