我有以下课程,
class Simulation {
public:
btDefaultCollisionConfiguration collisionConfiguration;
btBroadphaseInterface broadphase;
btSequentialImpulseConstraintSolver solver;
btDynamicsWorld dynamicsWorld;
Simulation() {
broadphase = btCollisionDispatcher(&collisionConfiguration);
}
}
当我编译时,我收到此错误
cannot declare field ‘Simulation::broadphase’ to be of abstract type ‘btBroadphaseInterface’
现在我想我知道自己做错了什么。如果编译然后在我调用构造函数的那一刻,分配的内存将用于虚拟类,并且不包含子类(btCollisionDispatcher)。我知道如何使用指针来解决这个问题,但是我一直听到人们说你应该在C ++中使用指针,我想我会尝试一下。到目前为止我已经成功但我不知道该怎么做。
答案 0 :(得分:2)
是的,你只能有抽象类的指针或引用,因为你不能实例化一个抽象类,因为根据定义,它有一个“不完整”的定义(不是字面意思)。它只是一个界面。
如果你想避免使用指针,可以使用引用,如下所示:
class Simulation {
public:
btDefaultCollisionConfiguration collisionConfiguration;
btBroadphaseInterface& broadphase;
btSequentialImpulseConstraintSolver solver;
btDynamicsWorld dynamicsWorld;
Simulation() : broadphase(someFunctionThatReturnsAbtBroadphaseInterfaceReference()) {
}
}
或智能指针,如下:
// header for shared_ptr
#include <memory>
class Simulation {
public:
btDefaultCollisionConfiguration collisionConfiguration;
shared_ptr<btBroadphaseInterface> broadphase;
btSequentialImpulseConstraintSolver solver;
btDynamicsWorld dynamicsWorld;
Simulation() : broadphase(someFunctionThatReturnsAbtBroadphaseInterfacePointerOrSmartPointer()) {
}
}
答案 1 :(得分:0)
由于在你的类的实现中你已经在修改类型,为什么不只是存储要使用的实际类型的变量?
class Simulation {
public:
btDefaultCollisionConfiguration collisionConfiguration;
btCollisionDispatcher broadphase;
Simulation() : broadphase(&collisionConfiguration) {
}
};
请注意,上面的代码是正确的,但可能容易出错,因为一个成员依赖于在不同成员上进行初始化,请确保不要对类中的声明重新排序。
另一方面,如果要使用的实际类型不是硬编码的,则需要传递指针或引用(并确保不同对象的生命周期正确)。
答案 2 :(得分:0)
使用指针绝对没有问题。
至少在你使用某些图书馆的时候,你应该尝试按照他们想象的方式做事。
实现你的意思的最好方法就是实际使用它们。
不要担心它们。