Насколько я могу судить, вы описываете класс, который представляет алгоритм. Вы настраиваете алгоритм, затем запускаете алгоритм и затем получаете результат алгоритма. Я не вижу ничего плохого в объединении этих шагов в классе, если альтернативой является функция, которая принимает 7 параметров конфигурации и 5 выходных ссылок.
Это структурирование кода также имеет то преимущество, что вы можете разбить свой алгоритм на несколько этапов и поместить их в отдельные закрытые функции-члены. Вы можете сделать это и без класса, но это может привести к тому, что подфункции будут иметь много параметров, если у алгоритма много состояний. В классе вы можете удобно представить это состояние через переменные-члены.
Одна вещь, на которую вы могли бы обратить внимание, - это то, что структурирование вашего кода может легко соблазнить вас использовать наследование для обмена кодом между похожими алгоритмами. Если алгоритм A определяет частную вспомогательную функцию, которая нужна алгоритму B, легко сделать эту функцию-член защищенной и затем получить доступ к этой вспомогательной функции, имея класс B, производный от класса A. Также может быть естественным определить третий класс C, который содержит общий код, а затем A и B являются производными от C. Как правило, наследование, используемое только для совместного использования кода в не виртуальных методах, - не лучший способ - он негибкий, и в конечном итоге вам приходится принимать элементы данных супер класс и вы нарушаете инкапсуляцию суперкласса. Как правило, в этой ситуации предпочитайте выделять общий код из обоих классов без использования наследования. Вы можете преобразовать этот код в функцию, не являющуюся членом, или вы можете включить ее в служебный класс, который вы затем используете, не производя от него.
YMMV - что лучше, зависит от конкретной ситуации. Факторизация кода в общий суперкласс является основой для шаблона метода , поэтому при использовании виртуальных методов наследование может быть тем, что вам нужно.