[英]cannot declare variable ‘’ to be of abstract type ‘’
編輯:花了一點時間理解我寫的代碼后,我仍然不知道它有什么問題。 這是我從中派生我的類的基類:
///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;
};
以下是我實現主要功能的地方。 仍然不確定為什么我收到這個錯誤。
我在Windows上使用vc2010和代碼塊的代碼沒有問題:
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’
基類是抽象的原因是這個純虛函數:
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*
。
因此,派生類定義了具有不同參數的新函數 ,但它沒有從基類定義純虛函數,因此派生類仍然是抽象的。
您需要使用與基類完全相同的參數類型來定義函數。
Ovgl::DisablePairCollision
是一個抽象類,意味着它至少包含一個純虛函數 。
您需要從此類派生並實現它的抽象功能。
例如:
class DisablePairCollision { virtual void foo() = 0; };
class DerivedClass : public DisablePairCollision { virtual void foo() {} };
DisablePairCollision* pCallback;
pCallback = new DerivedClass;
pCallback->foo();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.