Cập nhật: shared_ptr trong ví dụ này giống như trong Boost, nhưng nó không hỗ trợ shared_polymorphic_downcast (hoặc dynamic_pointer_cast hoặc static_pointer_cast cho vấn đề đó)!Downcasting shared_ptr <Base> to shared_ptr <Derived>?
Tôi đang cố gắng để khởi tạo một con trỏ chia sẻ cho một lớp học có nguồn gốc mà không làm mất tính tham khảo:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
Cho đến nay, như vậy tốt. Tôi đã không mong đợi C + + để ngầm chuyển đổi Base * thành Derived *. Tuy nhiên, tôi muốn các chức năng thể hiện bằng mã (có nghĩa là, duy trì số lượng tham chiếu trong khi downcasting con trỏ cơ sở). Suy nghĩ đầu tiên của tôi là cung cấp một nhà điều hành dàn diễn viên trong cơ sở để một chuyển đổi ngầm để nguồn gốc có thể xảy ra (ví pedants: Tôi sẽ kiểm tra xem các diễn viên xuống là hợp lệ, đừng lo lắng):
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
Vâng, nó không giúp được gì. Dường như trình biên dịch hoàn toàn bỏ qua toán tử định kiểu của tôi. Bất kỳ ý tưởng làm thế nào tôi có thể làm cho việc phân công shared_ptr làm việc? Đối với các điểm phụ: loại Base* const
là gì? const Base*
Tôi hiểu, nhưng Base* const
? const
đề cập đến trong trường hợp này là gì?
Tại sao bạn cần shared_ptr, thay vì shared_ptr ? –
Bill
Vì tôi muốn truy cập chức năng trong Nguồn gốc không có trong Cơ sở, mà không nhân bản đối tượng (tôi muốn một đối tượng duy nhất, được tham chiếu bởi hai con trỏ được chia sẻ). Nhân tiện, tại sao các nhà khai thác không hoạt động? –