Ho questo codice esistente in cui hanno una classe e un metodo di inizializzazione in quella classe. Si prevede che, una volta creato l'oggetto della classe, debbano chiamare l'inizializzazione su di esso.
Motivo per cui esiste il metodo di inizializzazione L'oggetto viene creato in anticipo per avere un ambito globale e quindi il metodo di inizializzazione viene chiamato in seguito dopo aver caricato una dll da cui dipende.
Problema con l'inizializzazione La classe ora ha questo bool isInitialized che deve essere verificato in ogni metodo prima di procedere e restituisce un errore se non è inizializzato. In poche parole, è un grande dolore.
Una possibile soluzione Inizializza nel costruttore. Avere solo un puntatore all'oggetto nell'ambito globale. Crea l'oggetto reale dopo il caricamento della dll.
Problema con la soluzione di cui sopra Chiunque crei un oggetto di questa classe deve sapere che deve essere creato solo dopo il caricamento della DLL, altrimenti fallirà.
È accettabile?
call_once
in C ++ 11 . I progetti che non sono ancora su C ++ 11 dovrebbero studiare come call_once è implementato in C ++ 11 (concentrarsi su quale problema risolve, e poi come), e quindi implementarlo nuovamente nel loro (vecchio) sapore di C ++. È necessaria una primitiva di sincronizzazione sicura multi-thread, il cui stato deve essere inizializzato staticamente (con un valore costante). Si noti che i compilatori pre-C ++ 11 potrebbero avere altre idiosincrasie che devono essere soddisfatte.