也许这个例子将有助于解释这个概念。您必须定义一个从现有抽象类派生的新类。您使用回调代码覆盖抽象类方法之一。然后创建派生类的对象并将其传递给要调用回调的函数。这是一种足够常见的 C++ 技术。
struct MyContactResultCallback : public ContactResultCallback
{
btScalar addSingleResult(btManifoldPoint& cp,
const btCollisionObjectWrapper* colObj0Wrap,
int partId0,
int index0,
const btCollisionObjectWrapper* colObj1Wrap,
int partId1,
in index1)
{
// your callback code here
}
};
MyContactResultCallback callback;
world.contactPairTest(bodyA, bodyB, callback);
我应该补充一点,我对这个库一无所知。我刚刚阅读了文档。
编辑
展示如何将上下文成员添加到MyContactResultCallback。
struct MyContactResultCallback : public ContactResultCallback
{
MyContactResultCallback(some_type* ptr) : context(ptr) {}
btScalar addSingleResult(btManifoldPoint& cp,
const btCollisionObjectWrapper* colObj0Wrap,
int partId0,
int index0,
const btCollisionObjectWrapper* colObj1Wrap,
int partId1,
in index1)
{
context->currentPoints += 10;
}
some_type* context;
};
MyContactResultCallback callback(ptr_to_some_object);
world.contactPairTest(bodyA, bodyB, callback);
ptr_to_some_object 是指向您要递增的具有currentPoints 的对象的指针。我不知道那是什么类型的对象,所以我刚才说some_type,你可以用任何真正的类型替换它。
这是使用对象作为回调而不是函数的要点。如果回调是一个对象,您可以将数据成员添加到您想要的任何目的,您不能对函数执行此操作。