您将如何在物理引擎中构建类交互?

时间:2014-03-14 19:21:07

标签: c++ oop class-hierarchy

我用C ++编写了一个物理引擎,我已经停止了,即我应该如何设计类层次结构。我特别关注的是WorldBody类。 Body应向World公开World然后可以处理的一些详细信息。但与此同时,我不希望用户能够访问Body的所有属性。但我仍然希望引擎的用户能够改变身体中的某些东西。例如,它的位置。你会如何根据课程来构建这个?

2 个答案:

答案 0 :(得分:0)

定义interface(即纯虚拟类),指定要从Body公开的函数。让Body实现该接口。

允许使用该界面,而不是Body使用World

此模式称为组合

答案 1 :(得分:0)

最近,我通过为受限操作引入特殊接口并从中继承 protectedly 来解决类似问题。像这样:

struct RestrictedBodyFunctions
{
  virtual void step() = 0;

  virtual Body& asBody() = 0;
};


struct Body : protected RestrictedBodyFunctions
{
  static std::unique_ptr<Body> createInWord(World &world)
  {
    auto Body = std::unique_ptr<Body>{new Body()};
    world.addBody(*body);  // cast happens inside Body, it's accessible
    return std::move(body);
  }

  std::string getName() const;
  void setName(std::string name);

protected:
  void step() override
  { /*code here*/ }

  Body& asBody() override
  { return *this; }
};


struct World
{
  void addBody(RestrictedBodyFunctions &body)
  {
    m_bodies.push_back(&body);
  }

  void step()
  {
    for (auto *b : m_bodies)
    {
      myLog << "Stepping << " b->asBody().getName() << '\n';
      b->step();
    }
  }

private:
  std::vector<RestrictedBodyFunctions*> m_bodies;
};

通过这种方式,用户可以使用Body创建createInWorld个对象,但只有Body的公共部分才能获得,World获取处理RestrictedBodyFunctions

您拥有的另一个选择是扭转上述想法 - 提供受限制的公共接口PublicBody,并Body派生PublicBody。您的内部类将使用完整的Body,而工厂函数确保只有PublicBody - 类型的句柄可供客户端使用。这种替代方案是一种更简单的设计,但对谁可以访问完整功能的控制较少。