【问题标题】:cannot declare variable ‘’ to be of abstract type ‘’不能将变量“”声明为抽象类型“”
【发布时间】:2012-07-23 08:52:18
【问题描述】:

编辑:花了一点时间理解我编写的代码后,我仍然不知道它有什么问题。这是我派生类的基类:

///ContactResultCallback is used to report contact points
struct  ContactResultCallback
{
    short int   m_collisionFilterGroup;
    short int   m_collisionFilterMask;

    ContactResultCallback()
        :m_collisionFilterGroup(btBroadphaseProxy::DefaultFilter),
        m_collisionFilterMask(btBroadphaseProxy::AllFilter)
    {
    }

    virtual ~ContactResultCallback()
    {
    }

    virtual bool needsCollision(btBroadphaseProxy* proxy0) const
    {
        bool collides = (proxy0->m_collisionFilterGroup & m_collisionFilterMask) != 0;
        collides = collides && (m_collisionFilterGroup & proxy0->m_collisionFilterMask);
        return collides;
    }

    virtual btScalar    addSingleResult(btManifoldPoint& cp,    const btCollisionObjectWrapper* colObj0Wrap,int partId0,int index0,const btCollisionObjectWrapper* colObj1Wrap,int partId1,int index1) = 0;
};

现在这是我的派生类:

class DisablePairCollision : public btCollisionWorld::ContactResultCallback
{
public:
    virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObject* colObj0, int32_t partId0, int32_t index0, const btCollisionObject* colObj1, int32_t partId1, int32_t index1);

    btDiscreteDynamicsWorld* DynamicsWorld;
};

下面是我实现主要功能的地方。仍然不确定为什么我会收到此错误。

我在带有 vc2010 和代码块的 windows 上使用下面的代码没有问题:

btScalar DisablePairCollision::addSingleResult(btManifoldPoint& cp, const btCollisionObject* colObj0, int32_t partId0, int32_t index0, const btCollisionObject* colObj1, int32_t partId1, int32_t index1)
{
    // Create an identity matrix.
    btTransform frame;
    frame.setIdentity();

    // Create a constraint between the two bone shapes which are contacting each other.
    btGeneric6DofConstraint* Constraint;
    Constraint = new btGeneric6DofConstraint( *(btRigidBody*)colObj0, *(btRigidBody*)colObj1, frame, frame, true );

    // Set limits to be limitless.
    Constraint->setLinearLowerLimit( btVector3(1, 1, 1 ) );
    Constraint->setLinearUpperLimit( btVector3(0, 0, 0 ) );
    Constraint->setAngularLowerLimit( btVector3(1, 1, 1 ) );
    Constraint->setAngularUpperLimit( btVector3(0, 0, 0 ) );

    // Add constraint to scene.
    DynamicsWorld->addConstraint(Constraint, true);
    return 0;
}

现在我正在尝试在 Ubuntu 上编译我的项目,但是当我尝试使用该类时出现此错误:

/home/steven/Desktop/ovgl/src/OvglScene.cpp:211: error: cannot declare variable ‘Callback’ to be of abstract type ‘Ovgl::DisablePairCollision’

【问题讨论】:

  • @LuchianGrigore:更好:Callback 在哪里?
  • @SteveDeFacto:你在 Windows 上使用什么编译器和 Code::Blocks?
  • 回调是类函数中的一个变量。我这样定义它: DisablePairCollision Callback;我在代码块中使用了 GCC MinGW 编译器。
  • @SteveDeFacto:您发布的代码与错误无关。你为什么发布它?为什么不发布包含实际错误行的代码?

标签: c++ inheritance gcc abstract-class pure-virtual


【解决方案1】:

基类是抽象的原因是这个纯虚函数:

virtual btScalar addSingleResult(
  btManifoldPoint& cp,
  const btCollisionObjectWrapper* colObj0Wrap,
  int partId0,
  int index0,
  const btCollisionObjectWrapper* colObj1Wrap,
  int partId1,
  int index1) = 0;

派生类DisablePairCollision 尝试定义该函数,但没有正确执行:

virtual btScalar addSingleResult(
   btManifoldPoint& cp,
   const btCollisionObject* colObj0,
   int32_t partId0,
   int32_t index0,
   const btCollisionObject* colObj1,
   int32_t partId1,
   int32_t index1);

如您所见,一些参数具有不同的类型。例如。 colObj0 是 const btCollisionObject* 类型,但它应该是 const btCollisionObjectWrapper* 类型。

因此,派生类定义了一个具有不同参数的新函数,但它并没有从基类中定义纯虚函数,因此派生类仍然是抽象的。

您需要使用与基类中完全相同的参数类型来定义函数。

【讨论】:

  • 显然我必须安装不同版本的子弹。谢谢!
【解决方案2】:

Ovgl::DisablePairCollision 是一个抽象类,意味着它包含至少一个纯虚函数。

您需要从这个类派生并实现它的抽象功能。

例如:

class DisablePairCollision { virtual void foo() = 0; };
class DerivedClass : public DisablePairCollision { virtual void foo() {} };

DisablePairCollision* pCallback;
pCallback = new DerivedClass;
pCallback->foo(); 

【讨论】:

  • 曾经有一段时间我理解了该代码,但现在我不知道它是如何工作的。我在上面发布代码的地方实际上是如何定义函数/类的东西。求...
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2021-06-10
相关资源
最近更新 更多