1. Это допустимо когда один класс не может жить без методов другого класса, но формально они никак друг с другом не связаны?
Недопустимо если хотите повторно использовать этот код. Фактически когда хотите правильно программировать, т.к. к возможности повторного использования кода надо стремиться. Мы у себя в команде пользуемся принципами - главное окошко может знать(но может и не знать по возможности) все о дочерних окнах, дочерние окна не знают ничего о главном. Как правило главное окно разных приложений содержит разную ф-сть, и так и так не получается повторно использовать его. А дочерние наоборот можно, при этом не завязывая через h файлы друг друга. Кроме того есть еще масса способов не инклудить друг в друга h файлы - сигналы и слоты, специальные "открытые" структуры для обмена информацией между окнами.