Слабая связь классов и доступ к данным

Я пытаюсь реализовать сложный класс, конструкция которого требует спецификации условия, которое позволяет конструктору определить, когда объект был построен. Рассмотрим, например:

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?

Я просто ищу максимальную гибкость в моделировании условия завершения цикла. Не похоже, что абстрактный класс позволяет быть гибким с сигнатурой входного аргумента. С другой стороны, абстрактный класс кажется единственной вещью, которая позволила бы мне указать условие во время выполнения.

Благодарю.

1

Решение

Это просто моя мысль. Может быть, вы хотите использовать что-то подобное?

class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}

Затем вы можете создать конкретную траекторию, которую вы хотите:

RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}

Основная идея этого решения — переместить логику создания траектории в отдельный класс

1

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

Других решений пока нет …

По вопросам рекламы [email protected]