Tengo una clase resource_manager
que mantiene un std::vector<boost::shared_ptr<resource> >
internamente. resource_manager
es una clase de amigo de resource
. Quiero resource
s solo para ser creado/eliminado por resource_manager
, por lo que hice sus constructores privados (que funciona bien).¿Cómo puedo llamar a un destructor privado desde un shared_ptr?
Sin embargo, si hago el destructor privado, el código no se compila porque el destructor es llamado por boost::shared_ptr
, que no es un amigo de resource
. Estoy pensando en hacer cumplir la regla "no eliminar por clientes" devolviendo solo const resource*
desde el resource_manager
, pero de alguna manera no estoy satisfecho con la seguridad que proporciona este método (¿qué pasa si un cliente pasa de un puntero a no const?)
Además de la solución obvia de no usar shared_ptr
, ¿tiene alguna solución alternativa/mejor a mi problema?
"cliente pasa de alguna manera a través de un puntero a no constante" la única forma en que podría hacer es decir, si lanzan usando const_cast. Desde la perspectiva de la "seguridad" no hay diferencia entre los punteros sin formato y shared_ptr, la diferencia radica en la administración del tiempo de vida, de la cual no estoy seguro de cómo manejaría sin shared_ptr. – ronag
Un 'const resource *' no significa que no pueda eliminarlo. – UncleBens
@UncleBens: ¿No? ¡Pensé que el compilador no debería permitirte llamar a una función no const en un const! ¿Estoy equivocado? ¿O esta regla no se aplica al destructor? –