Ho una classe resource_manager
che gestisce internamente uno std::vector<boost::shared_ptr<resource> >
. resource_manager
è una classe di amici di resource
. Voglio che gli resource
s vengano creati/eliminati solo da resource_manager
, quindi ho reso privati i suoi costruttori (che funziona bene).Come posso chiamare un distruttore privato da un shared_ptr?
Tuttavia, se si rende privato il distruttore, il codice non viene compilato perché il distruttore è chiamato da boost::shared_ptr
, che non è un amico di resource
. Sto pensando di far rispettare la regola "non cancellare dai clienti" restituendo solodal resource_manager
, ma in qualche modo non sono soddisfatto della sicurezza offerta da questo metodo (e se un client si verifica in qualche modo attraverso un puntatore a non-const?)
Oltre all'ovvia soluzione di non utilizzare shared_ptr
, avete qualche soluzione alternativa/migliore al mio problema?
"client avviene in qualche modo attraverso un puntatore non-const" l'unico modo in cui potrebbe fare cioè se trasmettono usando const_cast. Dal punto di vista della "sicurezza" non vi è alcuna differenza tra i puntatori raw e shared_ptr, la differenza sta nella gestione del tempo di vita, di cui non sono sicuro come gestirmi senza shared_ptr. – ronag
Una 'const resource *' non significa che non è possibile eliminarlo. – UncleBens
@UncleBens: no? Pensavo che il compilatore non avrebbe permesso di chiamare una funzione non const su un const! Mi sbaglio? O questa regola non si applica al distruttore? –