具有抽象成员的对象(没有指针)

时间:2011-09-11 20:06:09

标签: c++ pointers polymorphism

我有以下课程,

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 ++中使用指针,我想我会尝试一下。到目前为止我已经成功但我不知道该怎么做。

3 个答案:

答案 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)

使用指针绝对没有问题。

至少在你使用某些图书馆的时候,你应该尝试按照他们想象的方式做事。

实现你的意思的最好方法就是实际使用它们。

不要担心它们。