Как насчет предположения, что право собственности на внедренный объект переходит к зависимому объекту. Это решит проблему времени жизни для композиции, избегая использования умных указателей. Но для сложных ситуаций, где право собственности имеет значение, умные указатели будут выбором.
class Car {
public:
Car(IEngine *pEngine) {
m_pEngine = pEngine;
}
...
~Car()
{
delete m_engine;
}
protected:
IEngine *m_pEngine;
}
В тех случаях, когда у наверняка есть время жизни меньше, чем у внедренного объекта, лучше передать внедренный объект как ссылку. Это будет ясно указывать на то, что внедренный объект не принадлежит объекту зависимость.