我正在尝试实现一个复杂的类,其构造需要指定一个条件,允许构造函数确定何时构造了对象。例如,考虑一下:
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
这样的当地人?
我只是在寻找循环终止条件建模的最大灵活性。它似乎不像抽象类允许一个人灵活地使用输入参数签名。另一方面,抽象类似乎是唯一允许我在运行时指定条件的东西。
感谢。
答案 0 :(得分:1)
这只是我的想法。也许你想用这样的东西?:
class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}
然后你可以创建你想要的特定轨迹:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}
这个解决方案的主要思想是在单独的类
中创建轨迹的移动逻辑