【发布时间】:2014-11-27 18:10:05
【问题描述】:
我想知道避免以下问题的推荐方法是什么。
我有一个rigidBody3D 类,它有一个指向另一个rigidBody 结构的指针,还有一个继承了rigidBody3D 的box3D 类。
class rigidBody3D {
public:
void setPosition(float x, float y, float z);
rigidBody* rb;
};
class box3D : public rigidBody3D {
public:
box3D(float w float h, float l);
..other box functions..
};
然后我有使用这些 3D 类的 2D 类。
class rigidBody2D {
public:
rigidBody2D();
void setPosition(float x, float y);
rigidBody3D body;
};
class box2D : public rigidBody2D {
public:
box2D(float w, float h);
box3D box;
};
例如rigidBody2D的setPosition调用它的rigidBody3D的3D setPosition。
void rigidBody2D::setPosition(float x, float y)
{
body.setPosition(x,y,0);
}
问题:
照原样,创建一个 box2D 对象会创建两个刚体指针。一个是因为 box2D 继承了具有rigidBody3D 的rigidBody2D。另一个是因为 box2D 有一个 box3D 对象,它继承了rigidBody3D。
我只想要一个刚体指针。我还希望能够为 box2D 等 2D 类调用 2D setPosition,但也可以调用它们的 3D 特定函数,例如 box2D 调用 box3D。
解决方案:
我使用虚拟继承来解决这个问题,并且继承了 3D 类而不是拥有它们的对象。
class rigidBody3D {
public:
void setPosition(float x, float y, float z);
rigidBody* rb;
};
class box3D : public virtual rigidBody3D {
public:
box3D(float w float h, float l);
..other box functions..
};
class rigidBody2D : private virtual rigidBody3D {
public:
rigidBody2D();
void setPosition(float x, float y);
};
class box2D : public rigidBody2D, private box3D {
public:
box2D(float w, float h);
};
void rigidBody2D::setPosition(float x, float y)
{
rigidBody3D::setPosition(x,y,0);
}
【问题讨论】:
-
你想通过让 2d 身体保持 3d 身体来实现什么?你想模拟什么样的真实世界情况?
-
为什么不从3D物体继承2D物体,并将
z坐标设置为0呢?您可能还应该更多地考虑您的设计,以及基类中应该包含什么。 -
我有一个指针指向的原始刚体的界面全是 3D。我想让我的 3D 图层尽可能靠近指针。我的 2D 类是为了简化我以后添加 2D 对象的任务,这些对象是以 2D 绘制的 3D 对象,并且它们的 z 分量设置为 0。
-
重新设计是我想做的。知道我想要一个 3D 后端和一个简化的 2D 界面,您有什么建议吗?
-
这是一种可能的解决方案。另一种方法是将层次结构模板化为维度数量,以便您拥有
object<2>、object<3>等。
标签: c++ class namespaces multiple-inheritance