Я реализую математическую библиотеку на C++. Библиотека будет скомпилирована в DLL, поэтому те, кто ее использует, будут нуждаться только в файлах заголовков определения классов.Ссылка на C++
Пользователями моих классов станут люди, которые не знакомы с языком. Однако есть некоторые объекты, на которые можно ссылаться в нескольких частях своих программ. Поскольку я не ожидаю, что они будут заниматься управлением памятью, я бы хотел сделать это сам. Поэтому мне нужно выполнить подсчет ссылок (сбор мусора - это не возможность).
Я хочу сделать что подсчет ссылок как можно более прозрачным, к примеру ...
// 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;
Все становится немного сложнее, когда я определяю объекты на поверхности, потому что некоторые поверхности определяются в терминах два кривые:
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
Я думал, что переопределение operator =
для указателей могли бы помочь:
// 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;
}
... но затем я обнаружил, что operator =
недействителен, если он не является нестационарным членом класса.
Может ли кто-нибудь мне помочь?
http://ootips.org/yonat/4dev/smart-pointers.html – derobert 2008-12-16 05:10:44
Я пытался сохранить свой код-шаблон бесплатно, но я не могу найти другое решение. Спасибо. – 2008-12-16 05:22:57