Estoy implementando una biblioteca de matemáticas en C++. La biblioteca se compilará en una DLL para que quienes la utilicen solo necesiten los archivos de encabezado y las definiciones de las clases.Recuento de referencias en C++
Los usuarios de mis clases serán personas que sean nuevas en el idioma. Sin embargo, hay algunos objetos a los que se puede hacer referencia en varias partes de sus programas. Como no espero que hagan la gestión de la memoria, me gustaría hacerlo yo mismo. Por lo tanto, tengo que implementar el conteo de referencias (la recolección de basura no es una posibilidad).
Quiero hacer que la referencia a contar lo más transparente posible, por ejemplo ...
// Define a Bézier curve
CVecList pts;
pts.Add(Vector(0,0,0));
pts.Add(Vector(0,0,100));
pts.Add(Vector(0,100,0));
pts.Add(Vector(0,100,100));
CCurve* c1 = new CBezier(pts);
// Define a 3rd order B-Spline curve
pts.Clear();
pts.Add(Vector(0,0,0));
pts.Add(Vector(0,200,100));
pts.Add(Vector(0,200,200));
pts.Add(Vector(0,-200,100));
pts.Add(Vector(0,-200,200));
pts.Add(Vector(0,0,0));
CCurve* c2 = new CBSpline(pts,3);
// The Bézier curve object must be deleted automatically
// because the only reference to it has been released
// Similar to IUnknown::Release() in COM
c1 = c2;
cosas se ponen un poco más difícil cuando defino objetos de superficie, debido a que algunas superficies se definen en términos de dos curvas:
CVecList pts;
// ...
CCurve* f = new CBezier(pts);
pts.Clear();
// ...
CCurve* g = new CBezier(pts);
// Mixed surface: S(u,v) = (1-v)*f(u) + v*g(u)
CSurface* s = new CMixed(f,g);
// There are two references to the first Bézier curve,
// the first one is f
// the second one is hidden in a member of CMixed
// Something similar applies to the second Bézier curve
pensé que anulando operator =
para los punteros podría haber ayudado:
// This is what I tried, but it's illegal:
typedef CReferenceCounted* PRC;
PRC& operator =(PRC& dest, PRC& source)
{
if (source)
source->AddRef();
if (dest)
dest->Release();
memcpy(&dest,&source,sizeof(PRC));
return dest;
}
... pero luego descubrí que operator =
no es válido a menos que sea un miembro no estático de una clase.
¿Alguien podría ayudarme?
http://ootips.org/yonat/4dev/smart-pointers.html – derobert
He intentado mantener mi plantilla de código libre, pero no puedo encontrar otra solución. Gracias. –
Eduardo podría editar esta publicación, seleccionar el código en su pregunta, luego hacer clic en el botón con 0s y 1s? Esto aplicará resaltado de sintaxis al código. –