Я думаю, что дизайн никогда не бывает правильным или неправильным, но вы можете оценить их в соответствии с некоторыми принципами, которые многие считают «хорошими» (см. Принципы ТВЕРДОГО ).
Ваш подход к отправке звучит разумно, но сделать Dialog глобальным для получения определенно считается "не очень хорошим". См. Голливудский принцип . Я предлагаю вам лучше передать метод обратного вызова вашему диспетчеру соединений, который является методом CController (который затем позволяет CProtocolManager декодировать его и вызывает другой метод обратного вызова из диалогового окна). Если обратные вызовы - это не то, что вам нужно, вы можете определить AbstractBaseClasses (ABC) как этот "AbstractMessageReceiver" с помощью метода
virtual void receive(const char*, int length) = 0;
Затем вы можете реализовать эту ABC в CProtocolManager и передать это как "AbstractMessageReceiver *" в CConnectionManager, который затем вызывает
m_myMessageReceiver->receive(m_buffer, m_length);
или что-то подобное.
Этот подход уменьшает сцепление, намного более тестируем и увеличивает возможность повторного использования.
Кроме того, я согласен с Am, что вы должны подумать о своей модели потоков!