и поместив их объявление в исходный файл.
Вы имеете в виду их определение. Вы уже поместили объявление в заголовок.
Это хорошая и обычная практика
Определение классов в другой единице перевода - хороший и распространенный способ скрыть это от других единицы перевода.
или есть лучшие способы скрыть вспомогательные классы?
Если вы также удалите объявление из заголовка, тогда вспомогательный класс станет еще более приватным .
Еще одна вещь, которую следует учитывать, это то, какую конфиденциальность вы ищете. Один из простых подходов - добавить комментарий, показывающий, какие классы и функции являются частью интерфейса publi c, а не являются его частью.
Какой подход лучше, зависит от условий.
функции, которые я хотел бы встроить, поэтому их код должен быть go в файле заголовка. Однако этот код явно использует вспомогательные классы, поэтому мне также придется определить их в файле заголовка.
Это ваши два варианта. Вам нужно решить, цените ли вы больше времени компиляции или конфиденциальности. Обратите внимание, что современные цепочки инструментов поддерживают встроенное расширение на этапе связывания, и в этом случае функции не обязательно должны быть определены встроенными, чтобы разрешить эту оптимизацию.