抽象インターフェイスとそのインターフェイスから派生した実装があり、コンストラクターが保護されている場合 (これらのオブジェクトの作成はクラス ファクトリからのみ利用可能 - DI パターンを実装するため)、ファクトリ関数で make_shared を使用するにはどうすればよいですか?
例えば:
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 は明らかに、InterfaceImpl または実際には IInterface の保護されたコンストラクターにアクセスできず、次のエラーが発生します。
error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'
ここを読んで(質問:boost::make_sharedを私のクラスの友達にする方法)、実装クラスに次のものを入れてみました:
friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();
それでもコンパイルされません。そこで、もう 1 つ IInterface クラスにも入れました。まだ喜びはありません。ここで私は何を間違えましたか?
編集:「友人」を使用して、コンパイルに使用される完全なソース ファイル...
#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();
}