2009-03-09 30 views
71

Tương đương với số static_cast với boost::shared_ptr là gì?static_cast với tăng :: shared_ptr?

Nói cách khác, làm thế nào tôi phải viết lại như sau

Base* b = new Derived(); 
Derived* d = static_cast<Derived*>(b); 

khi sử dụng shared_ptr?

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = ??? 
+22

Không nên là 'Base * b = new Derived();'? – legends2k

Trả lời

104

Sử dụng boost::static_pointer_cast:

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b); 
+0

Tôi đã cố gắng đúc và ghi lại con trỏ thô lúc đầu, không biết về static_pointer_cast. Vì vậy, tôi nghĩ hữu ích khi có thông tin này trên stackoverflow. – Frank

+4

'boost :: static_pointer_cast (b)' cũng có thể được sử dụng như 'Base' là ngầm định. – dalle

+4

Tôi chỉ nghĩ rằng tôi muốn chia sẻ rằng nếu bạn đang sử dụng này và lớp Derived đã không được bao gồm đầy đủ (tức là nó chỉ được chuyển tiếp tuyên bố) bạn nhận được rất vô ích "chuyển đổi loại không hợp lệ:" Base * "thành" Derived * "". Nó đã cho tôi khá một thời gian dài nhìn chằm chằm vào màn hình trước khi tôi figured nó ra :) –

22

Có ba nhà khai thác cast cho con trỏ thông minh: static_pointer_cast, dynamic_pointer_cast, và const_pointer_cast. Chúng nằm trong không gian tên boost (được cung cấp bởi <boost/shared_ptr.hpp>) hoặc không gian tên std::tr1 (do Boost hoặc triển khai TR1 của trình biên dịch của bạn cung cấp).

3

Là nhận xét: nếu Derived thực tế xuất phát từ Base, thì bạn nên sử dụng dynamic_pointer_cast chứ không phải là phôi tĩnh. Hệ thống sẽ có cơ hội phát hiện khi nào/nếu dàn diễn viên của bạn không chính xác.

+0

Hệ thống không thể phát hiện điều này nếu Base không có thành viên ảo. Dynamic_cast chỉ là phép thuật trên các lớp có các thành viên ảo. – Aaron

+0

Ngoài ra còn có một hit hiệu suất. Nếu bạn thực sự biết rằng các diễn viên nên luôn luôn thành công, static_cast sẽ làm việc với không có chi phí thời gian chạy. –

+0

... không có chi phí thời gian chạy * thường *. Tôi không thể nhớ lại các chi tiết nhưng với nhiều thừa kế ảo hoặc một số trường hợp góc khác có chi phí kỹ thuật, nhưng vẫn ít hơn dynamic_cast. –

2

Điều đáng nói là có sự khác biệt về số lượng toán tử truyền được cung cấp bởi Boost và triển khai TR1.

TR1 không xác định toán tử thứ ba const_pointer_cast()

+0

Theo [tham chiếu này] (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast), 'const_pointer_cast' có sẵn trong C++ 11. –

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