私が理解しているように、多態的なオブジェクトを渡す/返すには、ポインタまたは参照型を使用してスライスの問題を防ぐ必要があります。ただし、関数からオブジェクトを返すには、ローカル オブジェクトが存在しなくなるため、スタック上で作成して参照を返すことはできません。ヒープ上に作成して参照/ポインターを返す場合、呼び出し元はメモリを管理する必要があり、良くありません。
上記を念頭に置いて、多相型を返す関数をどのように記述すればよいでしょうか? どの返品メカニズム/タイプを使用しますか?
私が理解しているように、多態的なオブジェクトを渡す/返すには、ポインタまたは参照型を使用してスライスの問題を防ぐ必要があります。ただし、関数からオブジェクトを返すには、ローカル オブジェクトが存在しなくなるため、スタック上で作成して参照を返すことはできません。ヒープ上に作成して参照/ポインターを返す場合、呼び出し元はメモリを管理する必要があり、良くありません。
上記を念頭に置いて、多相型を返す関数をどのように記述すればよいでしょうか? どの返品メカニズム/タイプを使用しますか?
メモリ管理を処理し、所有権を明確にするスマート ポインターを返します。
#include <memory>
struct IFoo
{
virtual ~IFoo() {}
};
struct Foo1 : IFoo {};
struct Foo2 : IFoo {};
std::unique_ptr<IFoo> make_foo()
{
return std::unique_ptr<IFoo>{new Foo1()};
}
C++14 には があることに注意してください。これにより、直接std::make_unique
呼び出さなくても上記を実行できます。関連する質問new
を参照してください。