Tôi đang triển khai một thư viện toán bằng C++. Thư viện sẽ được biên dịch thành một DLL nên những người sử dụng nó sẽ chỉ cần các tệp tiêu đề các định nghĩa của các lớp.Tham chiếu Đếm trong C++
Người dùng lớp học của tôi sẽ là những người mới sử dụng ngôn ngữ. Tuy nhiên, có một số đối tượng có thể được tham chiếu trong một số phần của chương trình của họ. Vì tôi không mong đợi họ làm việc quản lý bộ nhớ, tôi muốn tự mình làm điều đó. Vì vậy, tôi phải thực hiện đếm tham chiếu (thu gom rác thải không phải là một khả năng).
Tôi muốn làm tài liệu tham khảo mà đếm như minh bạch càng tốt, ví dụ ...
// 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;
Mọi thứ trở nên phức tạp hơn một chút khi tôi xác định đối tượng bề mặt, bởi vì một số bề mặt được xác định theo hai đường cong:
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
tôi nghĩ rằng trọng operator =
cho con trỏ có thể giúp:
// 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;
}
... nhưng sau đó tôi thấy rằng operator =
không hợp lệ trừ khi nó là thành viên không tĩnh của một lớp.
Có ai có thể giúp tôi không?
http://ootips.org/yonat/4dev/smart-pointers.html – derobert
Tôi đã cố giữ mã mẫu của mình miễn phí, nhưng tôi không thể đưa ra giải pháp khác. Cảm ơn bạn. –
Eduardo bạn có thể chỉnh sửa bài đăng này, chọn mã trong câu hỏi của bạn, sau đó nhấp vào nút có 0 và 1 không? Điều này sẽ áp dụng cú pháp tô sáng cho mã. –