Я реализую математическую библиотеку в C ++. Библиотека будет скомпилирована в DLL, поэтому тем, кто ее использует, понадобятся только заголовочные файлы определений классов.
Пользователями моих занятий будут люди, которые плохо знакомы с языком. Однако есть некоторые объекты, на которые можно ссылаться в нескольких частях их программ. Поскольку я не ожидаю от них управления памятью, я бы хотел сделать это сам. Поэтому я должен реализовать подсчет ссылок (сборка мусора невозможна).
Я хочу сделать подсчет ссылок максимально прозрачным, например ...
// 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 =
недопустим, если он не является нестатическим членом класса.
Может ли кто-нибудь помочь мне?