Tôi đã thấy rằng một cách hữu ích để viết một phương pháp nhân bản mà trả về một tăng :: shared_ptr là để làmLàm thế nào để Thực hiện một phương pháp nhân bản sử dụng shared_ptr và kế thừa từ enable_shared_from_this
class A
{
public:
shared_ptr<A> Clone() const
{
return(shared_ptr<A>(CloneImpl()));
}
protected:
virtual A* CloneImpl() const
{
return(new A(*this));
}
};
class B : public A
{
public:
shared_ptr<B> Clone() const
{
return(shared_ptr<B>(CloneImpl()));
}
protected:
virtual B* CloneImpl() const
{
return(new B(*this));
}
};
Điều này cho phép việc sử dụng các hiệp phương sai với con trỏ thông thường trong khi vẫn gói nó trong sự an toàn của một con trỏ thông minh. Vấn đề của tôi là lớp B của tôi cần phải kế thừa từ boost :: enable_shared_from_this bởi vì ngay sau khi xây dựng nó cần phải đăng ký chính nó với một lớp riêng biệt, đi qua một con trỏ được chia sẻ cho chính nó. Tôi có một phương pháp Tạo kết thúc tốt đẹp việc xây dựng và đăng ký để đảm bảo rằng chúng luôn xảy ra cùng nhau. Việc thực hiện phương pháp sao chép trên không thể xử lý yêu cầu này, tuy nhiên. Việc đăng ký không thể xảy ra trong CloneImpl vì không có shared_ptr nào tồn tại "sở hữu" đối tượng, ngăn chặn cuộc gọi đến shared_from_this() và nếu logic này không có trong hàm ảo thì shared_ptr trỏ đến B, không biết về nhu cầu đăng ký của B khi nhân bản. Cách tốt nhất để xử lý vấn đề này là gì?
Mã này có biên dịch không? Hình như B :: Clone() ẩn A :: Clone(). –
Ví dụ này được biên soạn cho tôi. Tôi tin rằng đó là mục đích mà B :: Clone() ẩn A :: Clone() để bạn có được kiểu trả về đúng. – user334066