web-dev-qa-db-fra.com

ne peut pas déclarer la variable «» de type abstrait «»

EDIT: Après avoir passé un peu de temps à comprendre le code que j'ai écrit, je ne sais toujours pas ce qui ne va pas. C'est la classe de base dont j'ai dérivé ma classe:

///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;
};

Maintenant, voici ma classe dérivée:

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;
};

Et ci-dessous, c'est là que j'implémente la fonction principale. Je ne sais toujours pas pourquoi j'obtiens cette erreur.

J'utilisais le code ci-dessous sur Windows avec à la fois vc2010 et des blocs de code sans problème:

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;
}

Maintenant j'essaye de compiler mon projet sur Ubuntu mais j'obtiens cette erreur quand j'essaye d'utiliser cette classe:

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

La raison pour laquelle la classe de base est abstraite est cette fonction virtuelle pure:

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

La classe dérivée DisablePairCollision tente de définir cette fonction, mais elle ne le fait pas correctement:

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

Comme vous pouvez le voir, certains des arguments ont différents types. Par exemple. colObj0 est de type const btCollisionObject*, mais il doit être de type const btCollisionObjectWrapper*.

Par conséquent, la classe dérivée définit ne nouvelle fonction avec des arguments différents, mais elle ne définit pas la fonction virtuelle pure à partir de la classe de base, donc la classe dérivée est toujours abstraite.

Vous devez définir la fonction avec exactement les mêmes types d'arguments que dans la classe de base.

28
jogojapan

Ovgl::DisablePairCollision est une classe abstraite, ce qui signifie qu'elle contient au moins une fonction virtuelle pure .

Vous devez dériver de cette classe et implémenter la fonctionnalité abstract de celle-ci.

Par exemple:

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

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