C++ 对Box2D GetUserData的结果调用纯虚函数

C++ 对Box2D GetUserData的结果调用纯虚函数,c++,cocos2d-x,box2d,game-physics,C++,Cocos2d X,Box2d,Game Physics,首先,我使用Cocos2d-x-2.1.5和Box2D 2.3.0不太确定如何准确地检查哪个,但在cocos的存储库中找到了这些信息 当我试图从通过SetUserData方法分配给b2Body对象的对象调用纯虚拟函数时,出现了我的问题 我计划了一个方法updateBodies来更新精灵,精灵是我游戏对象表示的一部分 void GameplayLogicLayer::updateBodies(float pDeltaTime) { mWorld->Step(pDeltaTime, 1

首先,我使用Cocos2d-x-2.1.5和Box2D 2.3.0不太确定如何准确地检查哪个,但在cocos的存储库中找到了这些信息

当我试图从通过SetUserData方法分配给b2Body对象的对象调用纯虚拟函数时,出现了我的问题

我计划了一个方法updateBodies来更新精灵,精灵是我游戏对象表示的一部分

void GameplayLogicLayer::updateBodies(float pDeltaTime)
{
    mWorld->Step(pDeltaTime, 10, 10);

    for(b2Body* tBodies = mWorld->GetBodyList(); tBodies; tBodies = tBodies->GetNext()){
        A* tA = (static_cast<A*>(tBodies->GetUserData()));
        if(tA != NULL)
        {
            tA->callPureVirtualFunction();
            tA->callFunction();
        }
    }
}
您知道它是如何在执行纯虚函数时崩溃的,但在我从基类调用方法时工作得很好吗

编辑-响应LearnCos2D用户

下面是A班的内容

#ifndef __A_H__
#define __A_H__

#include "cocos2d.h"
#include "Box2D/Box2D.h"

USING_NS_CC;

class A
{
public:
    virtual void callPureVirtualFunction() = 0;
    void callFunction();
protected:
    CCSprite* mSprite;
    b2Body* mBody;
    b2Fixture* mFixture;
};

#endif // __A_H__
和C类实现。 .h文件:

.cpp文件:

#include "C.h"
#include "../Utilities/Constants.h"

C::C(CCLayer& pParent, b2World& pWorld, const char* pFileName, float pPositionX, float pPositionY, float pWidth, float pHeight)
{
    mWithSensor = false;

    // GRAPHICS
    if(pFileName)
    {
        mSprite = CCSprite::create(pFileName);
        mSprite->setPosition(CCPointMake(pPositionX, pPositionY));
        pParent.addChild(mSprite);
    }

    b2BodyDef tBodyDef;
    tBodyDef.type = b2_kinematicBody;
    tBodyDef.position.Set( pPositionX / PIXELS_IN_METER, pPositionY / PIXELS_IN_METER );
//  tCollisionBoxBodyDef.userData = this;
    tBodyDef.userData = NULL;

    mBody = pWorld.CreateBody(&tBodyDef);
    mBody->SetGravityScale(0.f);
    mBody->SetUserData(this);

    b2PolygonShape tBodyShape;
    tBodyShape.SetAsBox(pWidth / 2.f / PIXELS_IN_METER, pHeight / 2.f / PIXELS_IN_METER);

    b2FixtureDef tBodyFixtureDef;
    tBodyFixtureDef.shape = &tBodyShape;
    tBodyFixtureDef.friction = 0.4f;
    tBodyFixtureDef.density = 10.0f;
    tBodyFixtureDef.restitution = 0.1f;

    mFixture = mBody->CreateFixture( &tBodyFixtureDef );
}

C::C()
{

}

/*virtual*/ void C::callPureVirtualFunction()
{  

}

tBodies->GetUserData的返回类型是什么?CCLogType name 1:%s,typeidtBodies->GetUserData.name;CCLogType名称2:%s,typeidtA.name;执行下面的两行检查tA是否等于null返回:Type name 1:Pv。类型名称2:P1A。但一般来说,GetUserData返回void*。pureVirtualFunction是如何实现的?也许它不是,并且仍然是纯虚拟的,即没有实际的实现?只有两个类继承自类A,它们都实现了该方法。我甚至试图简化调试,创建了callPureVirtualFunction方法,但没有任何帮助。有什么想法吗这能解决你的问题吗?例如,不能将C*->void*->A*转换为空。只能在代码和数据指针大小相同的平台上执行C*->A*->void*->A*。
#ifndef __C_H__
#define __C_H__

#include "A.h"

class C : public A
{
public:
    C(CCLayer& pParent, b2World& pWorld, const char* pFileName, float pPositionX, float pPositionY, float pWidth, float pHeight);
    C();

    virtual void callPureVirtualFunction();
private:
    bool mWithSensor;
};

#endif // __C_H__
#include "C.h"
#include "../Utilities/Constants.h"

C::C(CCLayer& pParent, b2World& pWorld, const char* pFileName, float pPositionX, float pPositionY, float pWidth, float pHeight)
{
    mWithSensor = false;

    // GRAPHICS
    if(pFileName)
    {
        mSprite = CCSprite::create(pFileName);
        mSprite->setPosition(CCPointMake(pPositionX, pPositionY));
        pParent.addChild(mSprite);
    }

    b2BodyDef tBodyDef;
    tBodyDef.type = b2_kinematicBody;
    tBodyDef.position.Set( pPositionX / PIXELS_IN_METER, pPositionY / PIXELS_IN_METER );
//  tCollisionBoxBodyDef.userData = this;
    tBodyDef.userData = NULL;

    mBody = pWorld.CreateBody(&tBodyDef);
    mBody->SetGravityScale(0.f);
    mBody->SetUserData(this);

    b2PolygonShape tBodyShape;
    tBodyShape.SetAsBox(pWidth / 2.f / PIXELS_IN_METER, pHeight / 2.f / PIXELS_IN_METER);

    b2FixtureDef tBodyFixtureDef;
    tBodyFixtureDef.shape = &tBodyShape;
    tBodyFixtureDef.friction = 0.4f;
    tBodyFixtureDef.density = 10.0f;
    tBodyFixtureDef.restitution = 0.1f;

    mFixture = mBody->CreateFixture( &tBodyFixtureDef );
}

C::C()
{

}

/*virtual*/ void C::callPureVirtualFunction()
{  

}