C ++ Dependency Injection: время жизни объектов?

Я прихожу с C # и пытаюсь перевести некоторые из моих практик на C ++. Я использовал внедрение зависимостей в разных местах своего кода, используя необработанные указатели. Затем я решаю заменить необработанные указатели на std :: shared_ptr. В рамках этого процесса было предложено рассмотреть возможность использования автоматических переменных, выделяемых стеком, а не их динамического выделения (см. этот вопрос , хотя этот вопрос был в контексте unique_ptr, так что, возможно, это другое).

Я считаю, что в приведенном ниже примере показано использование автоматических переменных.

class MyClass
{ 
public:
   MyClass(ApplicationService& app): appService_(app)
   {
   }

   ~MyClass()
   {
        appService_.Destroy(something);

   }
private:   
   ApplicationService& appService_;
}

class ConsumerClass
{
    DoSomething()
    {
        CustomApplicationService customAppService;
        MyClass myclass(customAppService);
        myclass...
    }
}

В приведенном выше примере, когда customAppservice и myclass выходят из области видимости, как мне узнать, что будет уничтожено первым? Если customAppService уничтожается первым, деструктор MyClass завершится ошибкой. Это хорошая причина использовать shared_ptr вместо этого в этом сценарии или есть чистый способ обойти это?

UPDATE

ApplicationService - это класс, который является оболочкой для глобальных функций, необходимых для взаимодействия со сторонней библиотекой, которую мой код использует. У меня есть этот класс, поскольку я считаю, что это стандартный способ поддержки модульного тестирования и создания заглушек / имитации автономных функций. Этот класс просто делегирует вызовы соответствующим глобальным функциям. Вызов appService_.Уничтожить (что-нибудь); фактически уничтожает объект, используемый каждым конкретным экземпляром MyClass, не уничтожая ничего, что связано с самим классом Application.

9
задан Community 23 May 2017 в 12:30
поделиться