我正在尝试实现一个复杂的类,该类的构造需要指定条件的规范,该条件允许构造函数确定何时构造了对象。考虑例如:

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 TerminateConditionDone或类似的东西时标记n > 1000。基本上,我可以对其中的/* Signature */使用一些灵活性。

我如何实现这样的设置,其中TerminateCondition->Done可以利用RigidBody构造函数范围内的各种变量集,例如trajectory_之类的私有(private)成员或n之类的局部成员?

我只是在为循环终止条件建模时寻求最大的灵活性。似乎抽象类不允许输入参数签名具有灵活性。另一方面,抽象类似乎是唯一允许我在运行时指定条件的东西。

谢谢。

最佳答案

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

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

然后,您可以创建所需的特定轨迹:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
  : trajectory_(t.create(p))
{}

该解决方案的主要思想是在单独的类中创建轨迹的移动逻辑

关于c++ - 松散的类耦合和数据访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38672289/

10-10 02:38