C++ 对Box2D GetUserData的结果调用纯虚函数
首先,我使用Cocos2d-x-2.1.5和Box2D 2.3.0不太确定如何准确地检查哪个,但在cocos的存储库中找到了这些信息 当我试图从通过SetUserData方法分配给b2Body对象的对象调用纯虚拟函数时,出现了我的问题 我计划了一个方法updateBodies来更新精灵,精灵是我游戏对象表示的一部分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
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()
{
}