我想实现一个复杂的类,其构造需要指定一个条件,允许构造函数确定何时构建对象。考虑,例如:松散类耦合和数据访问
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:您可以选择传递一个工厂对象,这将在''this''中创建'RigidBody''c'tor的正确条件。具有完整的'RigidBody'访问权限(即“公共”)。 – m8mble
关于2:使用抽象基本条件基本上说:“我们是否完成,将根据以下签名确定”。如果你不想这样做,也许你需要像弹道工厂这样的东西,它会自动决定是否完成。 – m8mble
最后总的来说:好像你有一个你不想分离/模块化的接口('RigidBody')。为什么不这样做呢?准确地说:添加基于哪个“RigidBody”可以构建的类'RigidBodyConstructionInfo'。反过来,'RigidBodyConstructionInfo'可以从一些工厂接口来构建,其实现可以依赖于运行时的东西。 – m8mble