我用C ++编写了一个物理引擎,我已经停止了,即我应该如何设计类层次结构。我特别关注的是World
和Body
类。 Body
应向World
公开World
然后可以处理的一些详细信息。但与此同时,我不希望用户能够访问Body
的所有属性。但我仍然希望引擎的用户能够改变身体中的某些东西。例如,它的位置。你会如何根据课程来构建这个?
答案 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
- 类型的句柄可供客户端使用。这种替代方案是一种更简单的设计,但对谁可以访问完整功能的控制较少。