อัปเดต: shared_ptr ในตัวอย่างนี้เหมือนใน Boost แต่ไม่รองรับ shared_polymorphic_downcast (หรือ dynamic_pointer_cast หรือ static_pointer_cast สำหรับเรื่องนั้น)!
ฉันพยายามเริ่มต้นตัวชี้ที่ใช้ร่วมกันไปยังคลาสที่ได้รับโดยไม่สูญเสียจำนวนอ้างอิง
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;
จนถึงตอนนี้ดีมาก ฉันไม่ได้คาดหวังว่า C ++ จะแปลง Base * เป็น Derived * โดยปริยาย อย่างไรก็ตามฉันต้องการฟังก์ชันที่แสดงโดยรหัส (นั่นคือรักษาการนับการอ้างอิงในขณะที่ดาวน์แคสต์ตัวชี้ฐาน) ความคิดแรกของฉันคือการจัดหาผู้ดำเนินการแคสต์ใน Base เพื่อให้การแปลงโดยปริยายเป็น Derived สามารถเกิดขึ้นได้ (สำหรับ pedants: ฉันจะตรวจสอบว่าดาวน์คาสต์ถูกต้องไม่ต้องกังวล):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
มันไม่ได้ช่วยอะไร ดูเหมือนว่าคอมไพเลอร์ไม่สนใจตัวดำเนินการพิมพ์คาสต์ของฉันโดยสิ้นเชิง มีความคิดอย่างไรที่ฉันจะทำให้งาน shared_ptr ทำงานได้ สำหรับคะแนนพิเศษ: Base* const
เป็นประเภทใด? const Base*
ฉันเข้าใจ แต่Base* const
? อะไรconst
หมายถึงในกรณีนี้หรือไม่?