В большинстве случаев вы хотите уменьшить зависимости от вашего класса.Если этот класс образует неотъемлемую часть интерфейса (даже если член является личным), то вы можете предположить, что этот класс будет использовать любой, кто использует ваш класс.
В таком случае, имея его в качестве переменной-членаимеет смысл.
Если это деталь реализации вашего класса, вы должны скрыть эту деталь от пользователей, используя предварительное объявление, поэтому используйте тип, который допускает прямое объявление.
Этоочень маловероятно, что это будет ссылка.Ссылка должна быть инициализирована при построении вашего класса, и поэтому конструктор, вероятно, должен будет передать объект, на который он ссылается.Объявление его новым и разыменование может привести к путанице.
Если это указатель, ваш класс может управлять своим временем жизни с помощью деструктора.В этом случае я часто буду использовать необработанный указатель, так как он находится под полным контролем, и мой деструктор может успешно удалить его, предполагая, что мой класс не подлежит копированию.
Если вы используете shared_ptr, вы можете использовать прямое объявление.Но учтите, что ваша семантика теперь такова, что если вы копируете свой объект, все копии будут иметь указатель на один и тот же базовый объект.Если это не то, что вы хотите, shared_ptr, вероятно, не так.Кроме того, если вы используете shared_ptr, когда ваш класс не подлежит копированию, он на самом деле не используется совместно.
Поэтому, если вы не можете использовать unique_ptr, который разрешает прямое объявление, я бы выбрал необработанный указатель и не-copyable class.
Если ваш член остается деталью реализации, но является чем-то довольно стандартным, например, картой или вектором, не стоит «инкапсулировать его» до степени использования прямого объявления,только типы, содержащиеся в карте или векторе, но не сама карта или вектор.