Casting Poco::Shared Ptr en otro con diferente política de liberación

Estoy usando la biblioteca POCO C++.

Tengo una clase A que es hereda de IA y de Destructable. A e IA tienen protegido el dtor (no mi elección)

    class Destructable {
    public:
     virtual void destroy() = 0;
    };

    class IA
    {
     protected:
       ~IA();
    }

    class A : public IA, public Destructable
    {
       void destroy() {

       protected:
       ~IA();
    }

Me las arreglé para conseguir un compartidoPtr en A. Para manejar esto, creo un NullReleasePolicy que d'ont llama al dtor y un objeto SharedPtr personalizado

template 
class NullReleasePolicy
    /// The null release policy for SharedPtr, which don't delete pointer
{
public:
    static void release(C* pObj)
        /// DON'T delete the object.
    {
        //nothing to do
    }
};

template 
class DestructableReleasePolicy
{
public:
    static void release(C* pObj)
    {
        if (dynamic_cast(pObj) != NULL)
            pObj->destroy();
    }
};

template
using DestructableSharedPtr = Poco::SharedPtr >;

template
using NonDestructableSharedPtr = Poco::SharedPtr >;

Me gustaría tener un puntero compartido en IA.

Entiendo que es el método .cast() de un compartidoPtr devuelve un compartidoPtr con la misma política de liberación (RP). En mi caso no es posible porque no puedo llamar a destruir() en IA.

Veo que eso es = operador puede cambiar el RP. Así que Itry usando este código

DestructableSharedPtr a = createA();
        
NonDestructableSharedPtr tmp = a;
NonDestructableSharedPtr ia = tmp.cast();

Y tengo el error de compilación

.../poco/poco-1.10.1-all/include/Poco/SharedPtr.h: Dans l'instanciation de «void Poco::SharedPtr::release() [with C = IA; RC = Poco::ReferenceCounter; RP = NullReleasePolicy]» :
.../poco-1.10.1-all/include/Poco/SharedPtr.h:161:10:   requis par «Poco::SharedPtr::~SharedPtr() [with C = IA; RC = Poco::ReferenceCounter; RP = NullReleasePolicy]»
myFile.cpp:84:114:   requis depuis ici
.../poco/poco-1.10.1-all/include/Poco/SharedPtr.h:443:15: erreur: no matching function for call to «NullReleasePolicy::release(IA*&)»

Es como si el objeto IA estuviera incrustado en un compartimiento en lugar de compartir Ptr. Si echas un vistazo a la implementación del reparto es lógico.

No sé si hay una manera de hacer el trabajo para mi caso.

Lamento que mi puesto sea bastante largo pero fue necesario exponer toda la información.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por quantumquill


2 Respuestas: