Ну, одна очень простая концепция, которая помогла мне в этом, - это просто концепция "имеет" против "есть". Спросите себя, является ли содержащийся объект чем-то, что содержит содержащийся объект, или это что-то, что содержит содержащийся объект? Если это что-то, что имеет содержащийся объект, тогда уместно удержание. В противном случае, возможно, вам стоит обратить внимание на наследство.
Собака - это животное, и у нее есть нос, поэтому это:
class Animal
{
}
class Dog : Animal
{
Nose n;
}
Теперь это работает нормально. Одна «проблема» в этом подходе заключается в том, что вы тесно связываете носы и собаки, поэтому иногда вы увидите такие вещи, как указатель на интерфейс, а не объект, или вы можете использовать Google «Dependency Injection». Но, как говорится, «имеет» и «есть» часто достаточно близко для работы правительства.
Вначале просто попробуйте множество примеров, и со временем это станет естественным. Если у вас получатся спагетти, бросьте в них несколько фрикадельок и попробуйте снова! :)