Tôi cảm thấy như thế này đã được yêu cầu trước đó, nhưng tôi không thể tìm thấy nó trên SO, cũng không phải tôi có thể tìm thấy bất cứ điều gì hữu ích trên Google. Có lẽ "covariant" không phải là từ tôi đang tìm kiếm, nhưng khái niệm này rất giống với các kiểu trả về biến đổi trên các hàm, vì vậy tôi nghĩ nó có lẽ đúng. Dưới đây là những gì tôi muốn làm và nó mang lại cho tôi một lỗi trình biên dịch:C++ mẫu covariant
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Giả sử các lớp đó hoàn toàn có thịt ... Tôi nghĩ bạn sẽ có ý tưởng. Nó không thể chuyển đổi một số SmartPtr<Derived>
thành một số SmartPtr<Base>
vì một số lý do không rõ ràng. Tôi nhớ rằng điều này là bình thường trong C++ và nhiều ngôn ngữ khác, mặc dù tại thời điểm này tôi không thể nhớ tại sao.
Câu hỏi gốc của tôi là: cách tốt nhất để thực hiện thao tác gán này là gì? Hiện tại, tôi đang kéo con trỏ ra khỏi số SmartPtr
, đưa nó lên loại cơ sở, sau đó gói nó vào một loại mới SmartPtr
của loại thích hợp (lưu ý rằng đây không phải là tài nguyên bị rò rỉ vì lớp học SmartPtr
được trồng tại nhà của chúng tôi sử dụng tham chiếu xâm nhập đếm). Đó là dài và lộn xộn, đặc biệt là khi tôi sau đó cần phải bọc SmartPtr
trong một đối tượng khác ... bất kỳ phím tắt?
ẩn các nhận xét @MSN: Tôi đã học bằng cách dùng thử và lỗi rằng điều này là không đủ để hoàn thành trình tạo bản sao "bình thường" và toán tử gán. Vì vậy, bạn phải triển khai cả hai: SmartPtr (const SmartPtr &) VÀ mẫu SmartPtr (const SmartPtr &) (tương tự cho op =) –
mmmmmmmm
Vâng vâng, đó là ý của tôi :) – MSN
Từ C++ 11 trở đi bạn cũng thêm move-constructor và move-assignment (những người có '&&'). –