Я пытаюсь реализовать сложный класс, конструкция которого требует спецификации условия, которое позволяет конструктору определить, когда объект был построен. Рассмотрим, например:
class RigidBody
{
private:
std::vector<double> trajectory_;
// Other stuff...
public:
RigidBody(std::unique_ptr<TerminateCondition>, std::vector<double> const &);
// Other stuff...
};
Вот как может выглядеть конструктор:
RigidBody::RigidBody(std::unique_ptr<TerminateCondition> condition, std::vector<double> const &p)
{
int n = 0;
while(!condition->Done( /* Signature */))
{ n++;
/* Do other stuff... */
// such as, trajectory_.push_back(sin(n * dt));
}
}
я представляю себе TerminateCondition
быть абстрактным классом.
Требование 1: Доступ к RigidBody
члены
мне бы хотелось class TerminateConditionAtRest: public TerminateCondition
быть в состоянии использовать trajectory_
, чтобы я мог закончить на таких условиях, как std::abs(trajectory.back() - trajectory_[0]) < epsilon
, Нужно ли заставлять Done(...)
взять vector const &
в качестве входного аргумента и передать trajectory_
к этому?
Требование 2: Гибкость с подписью Done(...)
Я мог бы хотеть class TerminateConditionNumSteps: public TerminateCondition
помечать Done
когда n > 1000
или что-то подобное. В принципе, я мог бы использовать некоторую гибкость с /* Signature */
там.
Как мне добиться такой настройки, при которой TerminateCondition->Done
может использовать как разнообразный набор переменных, доступных в рамках RigidBody
конструктор, такой как частные члены, такие как trajectory_
или местные жители, как n
?
Я просто ищу максимальную гибкость в моделировании условия завершения цикла. Не похоже, что абстрактный класс позволяет быть гибким с сигнатурой входного аргумента. С другой стороны, абстрактный класс кажется единственной вещью, которая позволила бы мне указать условие во время выполнения.
Благодарю.
Это просто моя мысль. Может быть, вы хотите использовать что-то подобное?
class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}
Затем вы можете создать конкретную траекторию, которую вы хотите:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}
Основная идея этого решения — переместить логику создания траектории в отдельный класс
Других решений пока нет …