Đưa ra một giao diện trừu tượng và triển khai thực hiện từ giao diện đó, nơi các nhà xây dựng được bảo vệ (tạo các đối tượng này chỉ có sẵn từ một nhà máy lớp học - để triển khai mẫu DI). Tôi sử dụng make_shared trong chức năng của nhà máy?Sử dụng make_shared với một constructor được bảo vệ + giao diện trừu tượng
Ví dụ:
class IInterface
{
public:
virtual void Method() = 0;
};
class InterfaceImpl : public IInterface
{
public:
virtual void Method() {}
protected:
InterfaceImpl() {}
};
std::shared_ptr<IInterface> Create()
{
std::shared_ptr<IInterface> object = std:: make_shared<InterfaceImpl>();
return object;
}
make_shared rõ ràng là không thể truy cập các nhà xây dựng được bảo hộ tại InterfaceImpl, hoặc thực sự trong IInterface, đem lại cho tôi những lỗi sau
error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'
Vì vậy, đọc ở đây (câu hỏi: How to make boost::make_shared a friend of my class), Tôi đã thử đưa những điều sau đây vào lớp triển khai:
friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();
Nó vẫn không biên dịch. Vì vậy, sau đó tôi đặt một số khác vào lớp IInterface. Vẫn không có niềm vui. Tôi đã làm gì sai ở đây?
EDIT: nguồn tập tin đầy đủ sử dụng để biên dịch, với "người bạn" ...
#include <memory>
class IInterface
{
public:
friend std::shared_ptr<IInterface> Create();
virtual void Method() = 0;
};
class InterfaceImpl : public IInterface
{
public:
virtual void Method() {}
protected:
friend std::shared_ptr<IInterface> Create();
InterfaceImpl() {}
};
std::shared_ptr<IInterface> Create()
{
std::shared_ptr<IInterface> object = std::make_shared<InterfaceImpl>();
return object;
}
void main()
{
std::shared_ptr<IInterface> i = Create();
}
Tôi đoán đó là VC10? GCC btw không có vấn đề miễn là bạn làm bạn 'make_shared()'. –
Đó là VS2010, mà thực sự đưa ra một cảnh báo (sai - chi tiết ở đây: http://connect.microsoft.com/VisualStudio/feedback/details/321690/c-vc9-bogus-cảnh báo-c4396-cho-hợp lệ-mã). – Robinson