2016-07-30 101 views
1

我想实现一个复杂的类,其构造需要指定一个条件,允许构造函数确定何时构建对象。考虑,例如:松散类耦合和数据访问

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来标记Donen > 1000或类似的东西。基本上,我可以在那里使用/* Signature */

如何实现这样的设置,其中TerminateCondition->Done可以利用多种多样的一套在RigidBody构造的范围内可用的变量,如私有成员像trajectory_或当地人喜欢n的?

我只是寻找建模循环终止条件的最终灵活性。它看起来不像抽象类允许用输入参数签名来灵活。另一方面,抽象类似乎是唯一能够让我在运行时指定条件的东西。

谢谢。

+1

创作轨迹的举动逻辑关于1:您可以选择传递一个工厂对象,这将在''this''中创建'RigidBody''c'tor的正确条件。具有完整的'RigidBody'访问权限(即“公共”)。 – m8mble

+1

关于2:使用抽象基本条件基本上说:“我们是否完成,将根据以下签名确定”。如果你不想这样做,也许你需要像弹道工厂这样的东西,它会自动决定是否完成。 – m8mble

+1

最后总的来说:好像你有一个你不想分离/模块化的接口('RigidBody')。为什么不这样做呢?准确地说:添加基于哪个“RigidBody”可以构建的类'RigidBodyConstructionInfo'。反过来,'RigidBodyConstructionInfo'可以从一些工厂接口来构建,其实现可以依赖于运行时的东西。 – m8mble

回答

1

这只是我的想法。也许你想用类似的东西?:

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

然后,您可以创建特定的轨迹你想:

RigidBody(TrajectoryCreator& t, const vector<float> &p) 
    : trajectory_(t.create(p)) 
{} 
这种解决方案的

主要思想是在单独的类