見落としている重要な可能性の 1 つは、クラス自体ではなく、ファクトリの注入です。これの利点の 1 つは、インスタンスの所有権をより明確にできることです。コンポーネントの所有権をコンテナーに明示的に与えているため、コードが少し見にくいことに注意してください。shared_ptr
ではなく ,を使用すると、物事が少しすっきりする可能性がありますunique_ptr
が、所有権があいまいになります。
したがって、次のようなコードから始めます。
struct MyContainer {
std::unique_ptr<IFoo> foo;
MyContainer() : foo(new Foo() ) {};
void doit() { foo->doit(); }
}
void useContainer() {
MyContainer container;
container.doit();
}
非工場バージョンは次のようになります
struct MyContainer {
std::unique_ptr<IFoo> foo;
template<typename T>
explicit MyContainer(std::unique_ptr<T> && f) :
foo(std::move(f))
{}
void doit() { foo->doit(); }
}
void useContainer() {
std::unique_ptr<Foo> foo( new Foo());
MyContainer container(std::move(foo));
container.doit();
}
工場出荷時のバージョンは次のようになります
struct FooFactory : public IFooFactory {
std::unique_ptr<IFoo> createFoo() override {
return std::make_unique<Foo>();
}
};
struct MyContainer {
std::unique_ptr<IFoo> foo;
MyContainer(IFooFactory & factory) : foo(factory.createFoo()) {};
void doit() { foo->doit(); }
}
void useContainer() {
FooFactory fooFactory;
MyContainer container(fooFactory);
container.doit();
}
IMO が C++ の所有権と有効期間について明示することは重要です。これは C++ のアイデンティティの重要な部分です。これは RAII や他の多くの C++ パターンの中心にあります。