我正在尝试为我的物理模拟设计类层次结构。我真的想在类之间共享变量(例如Vec3d pos
,Quat4d rot
),这些变量通过更复杂的多重继承图相互依赖。我提取了简单示例问题是什么(完整代码是here):
// ==== prefabricates for classes ... I was thinking this will solve the problem
class _pos { public: Vec3d pos;};
class _rot { public: Quat4d rot;};
// === classes
class KinematicBody : public _pos, public _rot{
// pos, rot ... inherited
void toGLmat( float * mat ); // make Opengl 4x4 matrix for rendering
};
class PointBody : public _pos, public Updateable {
public:
// pos ... inherited
Vec3d vel,force;
double mass;
inline void update_(double dt){ vel.add_mul(force, dt); pos.add_mul(vel,(dt/mass)); }; // can be called as obj->PointBody::update_(dt);
virtual void update (double t, double dt ){ update_(dt); }; // implements Updateable
};
// !!!! HERE IS THE PROBLEM
class RigidBody : public PointBody, public KinematicBody { // WARRNING : both PointBody and KinematicBody inheriate "pos"
public:
// pos,vel,force,mass,rot ... inherited
Mat3d momentOfInertia;
Vec3d torque;
Vec3d angular_velocity;
};
我尝试运行以下测试,以确保KinematicBody::pos
,PointBody::pos
,RigidBody::pos
共享同一块内存(完整代码here):
RigidBody rb;
KinematicBody * kb = &rb;
PointBody * pb = &rb;
rb. pos.set(1.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
kb->pos.set(2.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
pb->pos.set(3.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
我期待的结果如
1.0000 1.0000 1.0000
2.0000 2.0000 2.0000
3.0000 3.0000 3.0000
但我得到了以下错误:
error: request for member ‘pos’ is ambiguous
rb. pos.set(1.0); printf( "%f %f %f\n", rb.pos.x, kb->pos.x, pb->pos.x );
可以通过制作
来解决此错误 class RigidBody : public PointBody, public _rot {
而不是
class RigidBody : public PointBody, public KinematicBody {
但是我无法从void toGLmat( float * mat );
继承KinematicBody
......而且一般来说,它使课程的构成非常不稳定
有没有办法实现这种分享?我想通过制作 prefabricates ,如_pos
和_rot
,我可以做到这一点,但显然不是。