2013-02-20 9 views
5

Tôi có một cấu trúc quản lý các đối tượng có nguồn gốc từ một lớp cơ sở Entity, nhưng không kiểm soát tuổi thọ của chúng. Tôi muốn cấu trúc này được đưa ra con trỏ yếu như weak_ptr<Entity> để nó có thể biết nếu đối tượng đã bị phá hủy ở nơi khác.weak_ptr của một lớp cơ sở, trong khi shared_ptr là của một lớp dẫn xuất?

Tuy nhiên, bên ngoài cấu trúc quản lý nơi con trỏ được chia sẻ tồn tại, tôi muốn con trỏ được chia sẻ cụ thể hơn shared_ptr<SpecificEntity> (SpecificEntity sử dụng Thực thể làm lớp cơ sở).

Có cách nào để thực hiện việc này hay điều gì đó tương tự không?

Trả lời

11

Điều đó rất có thể. Bạn luôn có thể chuyển đổi một số shared_ptr<Derived> thành shared_ptr<Base> hoàn toàn và theo hướng khác bạn có std::static_pointer_caststd::dynamic_pointer_cast, điều bạn mong đợi là – tức là bạn kết thúc với một con trỏ mới thuộc loại khác nhau chia sẻ quyền sở hữu với con trỏ ban đầu. Ví dụ:

std::shared_ptr<Base> p(new Derived); 

std::shared_ptr<Derived> q = std::static_pointer_cast<Derived>(p); 

std::shared_ptr<Base> r = q; 

Hoặc, hơn C++ 11 kiểu:

auto p0 = std::make_shared<Derived>(); 

std::shared_ptr<Base> p = p0; 

auto q = std::static_pointer_cast<Derived>(p); 
+0

Ah, tôi không biết có phôi cho điều này! Cảm ơn bạn! –