Элегантный способ передачи параметров классу или его функциям-членам Переполнение стека

Я довольно новичок в программировании на C ++ и OO, и у меня возникли проблемы с правильным дизайном классов. Мое приложение основано на множестве параметров, которые могут быть установлены пользователем в файле конфигурации. Эти параметры считываются в начале выполнения и распределяются по различным частям программы, то есть классы создаются на основе этих параметров, которые выполняют разные задачи. Но похоже на этот вопрос

Элегантный способ передать несколько аргументов в функцию

Возможно, что некоторый класс зависит от множества различных параметров / опций (например, 9). Эти параметры могут указывать сам класс или выполнение открытых функций-членов. Эти параметры / параметры не должны изменяться во время выполнения. Я думал о различных решениях для встраивания всех параметров в соответствующий класс таким образом, чтобы избежать уродливых вызовов функций / конструкторов, но мне никто не нравится.

1) Храните только те параметры в каждом классе, которые необходимы для построения. Остальные передаются из структуры, содержащей файл конфигурации, функциям-членам по мере необходимости.

class A {
int x_, y_;
public:
A(int x, int y, int Opt3) : ... {}
void Method1(int Opt1, int Opt2);
void Method2(int Opt1, int Opt4);
...
}

Плюсы: зависимость класса и его метода от параметров становится очевидной. Минусы: это также может привести к вызовам функций со многими параметрами. Это также не идеально, так как я должен явно указывать все параметры для каждого вызова этой функции, хотя параметры не меняются.

2) Передайте все параметры классу при создании и сделайте их закрытыми переменными-членами. Это приводит к конструкторам типа

class A {
int x_, y_, Opt1, Opt2, ...
public:
A(int x, int y, Opt1, Opt2, ...) : ... {}
//some methods
.
.
.
}

что раздражает, если кто-то хочет, всегда должен явно указывать все параметры при создании нескольких объектов этого класса.

3) Сохраните все параметры в одну большую структуру. Сделайте общий указатель на эту структуру закрытой переменной-членом каждого класса. Плюсы: конструктор принимает только один указатель. Минусы: из класса interfrace становится не ясно, какие параметры из конфигурации используются этим классом. Это может быть разъяснено в комментариях.

4) Вдохновленный ответами в

Элегантный способ передать несколько аргументов в функцию

Определите структуру вложенных опций в каждом классе, который содержит необходимые параметры, например,

class A {
int x_, y_;
public:
A(int x, int y, Options& Opt) : ... {}
struct Options {
int Opt1 = default_value;
int Opt2 = default_value;
.
.
.
} Opt;
}

Плюсы: из интерфейса становится ясно, какие опции используются этим классом. Эти параметры можно прочитать непосредственно из файла конфигурации, добавив функцию-член в класс параметров. Экземпляр такого конкретного набора параметров может быть создан пользователем без файла конфигурации, и значения по умолчанию могут быть изменены в зависимости от потребностей. Помимо общих параметров для создания класса, только такой набор опций должен быть предоставлен конструктору. На самом деле это мой любимый подход.

Минусы: у меня проблемы с распознаванием того, какие из параметров должны быть закрытыми членами-переменными класса или должны входить в набор опций. Это приводит к вопросу о том, какими должны быть переменные-члены и каковы опции для функций класса / члена. Есть ли у вас совет?

Можете ли вы прокомментировать мои мысли и дать несколько советов?

Спасибо !

0

Решение

Задача ещё не решена.

Другие решения