Estoy trabajando en un proyecto donde se hace referencia a ciertos objetos; es una configuración muy similar a COM. De todos modos, nuestro proyecto tiene punteros inteligentes que alivian la necesidad de llamar explícitamente a Add() y Release() para estos objetos. El problema es que a veces los desarrolladores aún llaman a Release() con el puntero inteligente.¿Los punteros inteligentes pueden ocultar o redirigir selectivamente las llamadas de función a los objetos que están envolviendo?
Lo que estoy buscando es una forma de llamar al Release() desde el puntero inteligente para crear un error en tiempo de compilación o en tiempo de ejecución. El tiempo de compilación no me parece posible. Pensé que tenía una solución en tiempo de ejecución (ver el código a continuación), pero tampoco compila del todo. Aparentemente, la conversión implícita no está permitida después de usar operator ->().
De todos modos, ¿alguien puede pensar en una forma de lograr lo que estoy tratando de lograr?
Muchas gracias por su ayuda!
Kevin
#include <iostream>
#include <cassert>
using namespace std;
class A
{
public:
void Add()
{
cout << "A::Add" << endl;
}
void Release()
{
cout << "A::Release" << endl;
}
void Foo()
{
cout << "A::Foo" << endl;
}
};
template <class T>
class MySmartPtrHelper
{
T* m_t;
public:
MySmartPtrHelper(T* _t)
: m_t(_t)
{
m_t->Add();
}
~MySmartPtrHelper()
{
m_t->Release();
}
operator T&()
{
return *m_t;
}
void Add()
{
cout << "MySmartPtrHelper::Add()" << endl;
assert(false);
}
void Release()
{
cout << "MySmartPtrHelper::Release()" << endl;
assert(false);
}
};
template <class T>
class MySmartPtr
{
MySmartPtrHelper<T> m_helper;
public:
MySmartPtr(T* _pT)
: m_helper(_pT)
{
}
MySmartPtrHelper<T>* operator->()
{
return &m_helper;
}
};
int main()
{
A a;
MySmartPtr<A> pA(&a);
pA->Foo(); // this currently fails to compile. The compiler
// complains that MySmartPtrHelper::Foo() doesn't exist.
//pA->Release(); // this will correctly assert if uncommented.
return 0;
}
¿Puede reemplazar la asignación de la pila "A a" con una nueva asignación del operador? Esto no cambiará el problema original, pero eliminará uno de los típicos errores desagradables con el uso de punteros inteligentes de recuento de referencias. – sharptooth