J'implémente une bibliothèque mathématique en C++. La bibliothèque sera compilée dans une DLL afin que ceux qui l'utilisent n'aient besoin que des fichiers d'en-tête les définitions des classes.Comptage de référence en C++
Les utilisateurs de mes cours seront des personnes qui sont nouvelles dans la langue. Cependant, certains objets peuvent être référencés dans plusieurs parties de leurs programmes. Comme je ne m'attends pas à ce qu'ils fassent la gestion de la mémoire, j'aimerais le faire moi-même. Par conséquent, je dois implémenter le comptage des références (le garbage collection n'est pas une possibilité).
Je veux faire cette référence comptant le plus transparent possible, par exemple ...
// 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;
Les choses deviennent un peu plus compliqué quand je définir des objets de surface, parce que certaines surfaces sont définies en termes de deux courbes:
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
Je pensais que l'annulation de operator =
pour les pointeurs aurait pu aider:
// 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;
}
... mais j'ai trouvé que operator =
n'est pas valide à moins qu'il ne soit en tant que membre non-statique d'une classe.
Quelqu'un peut-il m'aider?
http://ootips.org/yonat/4dev/smart-pointers.html – derobert
J'ai essayé de garder mon code-modèle libre, mais je ne peux pas trouver une autre solution. Je vous remercie. –
Eduardo pouvez-vous éditer ce message, sélectionnez le code dans votre question, puis cliquez sur le bouton avec 0 et 1? Cela va appliquer la coloration syntaxique au code. –