Ваша самая первая строка нечеткая:
MyObject& obj = FactoryThatGivesAnObject();
Как это должно работать?Фабричный метод не может вернуть ссылку на временный объект, поэтому единственная разумная ссылка, которую он может вернуть, - это динамически созданный объект - но теперь, кто отвечает за этот объект?
(Если вы просто не возвращаете ссылку насуществующий объект, то есть. Но я предполагаю, что ваша фабрика действительно создает новые объекты.)
Этот код является автомобильной аварией с утечкой памяти;Я не вижу способа написать что-нибудь толковое.Гораздо лучший способ - вернуть вновь созданный объект в ответственный контейнер, например, shared_ptr
или unique_ptr
:
#include <memory>
std::unique_ptr<MyObject> FactoryFunction()
{
return std::unique_ptr<MyObject>(new MyObject(3,5,7));
}
Таким образом, если никто не заберет фабричный продукт или есливозникает исключение, динамически размещенный объект будет правильно удален.
Это также делает тривиальным назначение различных указателей в зависимости от условия:
std::unique_ptr<MyObject> x;
if (...) { x = Factory1(); }
else if (...) { x = Factory2(a,b); }
else { x = Factory3(argc, argv); }