2011-12-02 18 views
13

Có ai biết về việc triển khai shared_ptrweak_ptr cùng với một đối tác khởi tạo lười biếng không? Các yêu cầu của lớp học là:các con trỏ được chia sẻ, yếu và lười biếng trong C++

  • Một lớp lazy_ptr cho phép một khách hàng để xây dựng các đối tượng sau (nếu có), mà không cần phải thực hiện constructor

  • Một lớp weak_lazy_ptr rằng có ba trạng thái có thể : chưa xây dựng (sẽ không khóa để một shared_ptr), xây dựng (sẽ khóa cho một shared_ptr) và phá hủy (sẽ không khóa để một shared_ptr)

tôi đã tạo một số lớp không hoàn thành công việc một thời gian trước đây (see CVu article here) đã sử dụng shared_ptrweak_ptr khi triển khai. Những vấn đề chính với một mô hình có sử dụng con trỏ được chia sẻ và yếu thay vì tích hợp với họ theo:

  1. Khi tất cả lazy_ptr đối tượng đi ra khỏi phạm vi, bất kỳ tài liệu tham khảo yếu không còn có thể bị khóa, thậm chí nếu khách hàng khác đang giữ shared_ptr phiên bản

  2. xây dựng của các đối tượng trên chủ đề khác nhau không thể được kiểm soát

tôi đánh giá cao bất cứ gợi ý để những nỗ lực khác để hòa giải những vấn đề này, hoặc cho bất kỳ công việc i n tiến bộ có thể có trong lĩnh vực này.

+6

Nó gần giống như 'shared_ptr >', có đúng không? – GManNickG

+2

@ user1078210 Có lẽ bạn có thể tìm thêm thông tin [tại đây] (http: // stackoverflow.com/questions/878166/is-there-c-lazy-pointer). – ealves

+0

@GMan: 'boost :: optional' * không * cho phép xây dựng hoãn lại, nhưng' boost :: shared_ptr' cho phép điều đó, vì vậy cả hai đều không cần thiết, nếu tôi hiểu bạn. –

Trả lời

2

Để tạo xây dựng chậm mà không cần thông số:

boost::bind(boost::factory<T*>(), param1, param2) sẽ tạo ra một đối tượng hàm thực hiện tương đương với new T(param1, param2) mà không cần các thông số tại thời điểm xây dựng.

Để tạo một shared_ptr hỗ trợ xây dựng chậm này:

Bundle nhà máy của bạn với tiêu chuẩn boost::shared_ptr (trong một lớp học của sáng tạo của bạn, ví dụ), và you'llget kết quả mà bạn mô tả, trong đó có thích hợp weak_ptr chức năng ...

Dù đang gây nên các hoãn xây dựng của khách hàng nên chạy:

your_shared_ptr.reset(your_factory()); 

Dù đang gây nên các đối tượng phá hủy nên chạy:

your_shared_ptr.reset(); 

Con trỏ được chia sẻ sẽ evauluate để true chỉ trong suốt cuộc đời của đối tượng. Và nếu bạn muốn bạn phân biệt "chưa được xây dựng" từ "bị phá hủy", bạn có thể đặt một bool sau khi nhà máy được chạy.

Các vấn đề liên quan