松散 class 耦合和数据访问
Loose class coupling and data access
我正在尝试实现一个复杂的 class,其构造需要指定允许构造函数确定对象何时被构造的条件。例如考虑:
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
是一个抽象的 class。
需求 1:访问 RigidBody
个成员
我希望 class TerminateConditionAtRest: public TerminateCondition
能够使用 trajectory_
,这样我就可以在 std::abs(trajectory.back() - trajectory_[0]) < epsilon
等条件下终止。我是否需要强制 Done(...)
将 vector const &
作为输入参数并将 trajectory_
传递给它?
需求 2:Done(...)
签名的灵活性
我可能希望 class TerminateConditionNumSteps: public TerminateCondition
在 n > 1000
或类似的情况下标记 Done
。基本上,我可以在 /* Signature */
中使用一些灵活性。
我如何实现这样的设置,其中 TerminateCondition->Done
可以使用 RigidBody
构造函数范围内可用的一组变量,例如像 [=16 这样的私有成员=] 或当地人喜欢 n
?
我只是在寻找循环终止条件建模的最大灵活性。抽象 class 似乎不允许人们灵活地使用输入参数签名。另一方面,抽象 class 似乎是唯一允许我在 运行 时间指定条件的东西。
谢谢。
这只是我的想法。也许您想使用类似的东西?:
class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}
然后你可以创建你想要的特定轨迹:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}
此解决方案的主要思想是在单独 class
中创建轨迹的移动逻辑
我正在尝试实现一个复杂的 class,其构造需要指定允许构造函数确定对象何时被构造的条件。例如考虑:
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
是一个抽象的 class。
需求 1:访问 RigidBody
个成员
我希望 class TerminateConditionAtRest: public TerminateCondition
能够使用 trajectory_
,这样我就可以在 std::abs(trajectory.back() - trajectory_[0]) < epsilon
等条件下终止。我是否需要强制 Done(...)
将 vector const &
作为输入参数并将 trajectory_
传递给它?
需求 2:Done(...)
我可能希望 class TerminateConditionNumSteps: public TerminateCondition
在 n > 1000
或类似的情况下标记 Done
。基本上,我可以在 /* Signature */
中使用一些灵活性。
我如何实现这样的设置,其中 TerminateCondition->Done
可以使用 RigidBody
构造函数范围内可用的一组变量,例如像 [=16 这样的私有成员=] 或当地人喜欢 n
?
我只是在寻找循环终止条件建模的最大灵活性。抽象 class 似乎不允许人们灵活地使用输入参数签名。另一方面,抽象 class 似乎是唯一允许我在 运行 时间指定条件的东西。
谢谢。
这只是我的想法。也许您想使用类似的东西?:
class TrajectoryCreator
{
public:
virtual vector<float> create(const vector<float>& path) = 0;
}
然后你可以创建你想要的特定轨迹:
RigidBody( TrajectoryCreator& t, const vector<float> &p)
: trajectory_(t.create(p))
{}
此解决方案的主要思想是在单独 class
中创建轨迹的移动逻辑