Я ищу для моделирования с очень сложными начальными условиями от пользователя. Я пишу class A
, чьи переменные-члены должны быть инициализированы пользователем перед запуском A.Solve()
, чтобы получить результаты, хранящиеся в файле. Инициализация довольно сложная и требует нескольких временных структур данных, которые больше не понадобятся после инициализации. Итак, я написал еще один класс под названием class Initializer
, в котором хранится ссылка на объект class A
. Мой код будет выглядеть следующим образом:Моделирование класса Дизайн
class A {
friend class Initializer;
private:
// member variables storing the state of the system
public:
void Solve();
...
};
class Initializer {
private:
A& a
// Other data structures used in the initialization
...
public:
// functions called by the user to set up for the initialization
...
Initialize(); // after this is called, a will be ready to solve
};
int main(...) {
A a;
Initializer init(a);
// call functions on init to initialize the system
...
init.Initialize();
a.Solve();
return 0;
}
Но, похоже, структуры данных в init
будет жить в стеке для всей программы. Чтобы предотвратить это, это нормально, чтобы сделать это:
A a;
Initializer *init = new Initializer(a);
....
init.Initialize();
delete init;
a.Solve();
Или это выглядит ненужным и я должен просто есть все, содержащиеся в class A
?
Я не думаю, что здесь достаточно информации. Это зависит от многих вещей. Единственная причина создания класса «initializer» (с учетом упрощенного контекста вопроса) для этих данных, с моей точки зрения, заключалась бы в том, чтобы сохранить его в том случае, если вам нужно было создать множество версий класса a, поэтому вы может освобождать экземпляры класса a и поддерживать его данные конфигурации.В противном случае мне кажется, что это лишний слой абстракции. Но опять же, это мнение формируется на очень ограниченном объеме информации. – ChrisCM
Я согласен с @ChrisCM. Ненужный слой абстракции, если у вас есть только 1 'A' для инициализации. Что касается освобождения «Инициализатора» после 'init.Initialize()', то динамическое распределение через 'new/delete' будет работать. Вы также можете обернуть инициализацию инициализации (a); ...; init.Initialize() 'в блоке' {} ', или вы можете перемещать инициализатор инициализации (a); ...; init.Initialize() 'в какую-нибудь функцию' doIniti (a) '... –