Не бойся Эволюции (Рефакторинг).
Если существует множество классов, которые соответствуют теме, создайте общий базовый класс.
Вместо жесткого кодирования элементов данных используйте указатели на абстрактный базовый класс.
Например, вместо использования std::ifstream
используйте std::istream
.
В моем проекте у меня есть абстрактные классы для чтения и письма. Классы, которые поддерживают чтение и запись, используют эти интерфейсы. Я могу передать специализированных читателей в эти классы без изменения какого-либо кода. Считыватель базы данных наследуется от базового класса Reader и, следовательно, может использоваться везде, где используется считыватель.