Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从派生类设置值,同时从基类访问相同的值_C++_Box2d_Cocos2d X 3.0 - Fatal编程技术网

C++ 从派生类设置值,同时从基类访问相同的值

C++ 从派生类设置值,同时从基类访问相同的值,c++,box2d,cocos2d-x-3.0,C++,Box2d,Cocos2d X 3.0,我在检索基类正确的枚举值时遇到问题 class BaseClass { public: enum EntityId { EN_NONE = 0, EN_PLAYER = 1, EN_PLATFORM, EN_GROUND, EN_OBSTACLE, EN_OTHER }; void setEntityId(EntityId id) { _Entityid = id; }

我在检索基类正确的枚举值时遇到问题

class BaseClass
{
public:
    enum EntityId {
        EN_NONE = 0,
        EN_PLAYER = 1,
        EN_PLATFORM,
        EN_GROUND,
        EN_OBSTACLE,
        EN_OTHER
    };
    void setEntityId(EntityId id) { _Entityid = id; }
    EntityId getEntityId() { return _Entityid; }
protected:
    EntityId _Entityid;
};

初始化过程如下所示

DeriveredClassA->setEntityId(BaseClass::EntityId::EN_PLAYER)

DeriveredClassB->setEntityId(基类::EntityId::EN_)

它被放置到与该枚举对应的不同向量列表中

但是,我不得不使用
void*
来执行
静态\u强制转换
cats

像这样:

BaseClass* EA = static_cast<BaseClass*>(bodyUserDataA); //bodyUserDataA and bodyUserDataB are both void*
BaseClass* EB = static_cast<BaseClass*>(bodyUserDataB);
BaseClass*EA=static\u cast(bodyUserDataA)//bodyUserDataA和bodyUserDataB都是空的*
基类*EB=静态_转换(bodyUserDataB);
我正在尝试使用
EA->getEntityId()
EB->getEntityId()
进行检索,这样我就可以检查哪一个是EN_播放器,哪一个是EN_GROUND等等。这样我就可以将类从基本类升级到派生类,并用它做其他事情

尝试与virtual一起使用,但不知何故,我收到了2份_EntityID副本,这两份副本可以相同,也可以不同于该对象的派生类和基类

此外,我不能马上扔进DeriveredClass,因为代码检查将是巨大的,因为有许多不同类型的DeriveredClass及其对应的向量列表(DeriveredClassA、DeriveredClassB、DeriveredClassC、DeriveredClassD)

我的问题是,我需要如何正确设置基类和派生类,以便从基类访问与派生类相同的_EntityID?我的主要问题可能是我使用了不直接的虚拟函数,所以我保留默认值以理解我的问题


这是我的C++问题,因为我使用游戏引擎和物理引擎,所以添加了其他标签。

我相信你希望你的代码看起来更像这样:

class Entity
{
public:
    enum Type {
        EN_NONE = 0,
        EN_PLAYER = 1,
        EN_PLATFORM,
        EN_GROUND,
        EN_OBSTACLE,
        EN_OTHER
    };

    Type getType() { return _type; }

protected:
    Entity(Type type): _type(type) {}

private:
    const Type _type;
};
// bodyUserDataA and bodyUserDataB are both void*
Entity* const EA = static_cast<Entity*>(bodyUserDataA);
Entity* const EB = static_cast<Entity*>(bodyUserDataB);

switch (EA->getType())
{
    case Entity::EN_PLAYER:
    {
        PlayerEntity* player = static_cast<PlayerEntity*>(EA);
        std::cout << "Found player: " << player->getName();
        break;
    }
    case Entity::EN_OTHER:
        ...
    default:
        break;
}
那么,您的派生类和此基的用法将更像:

class PlayerEntity: public Entity, public SomeClass
{
public:
    PlayerEntity(std::string name): Entity(EN_PLAYER), _name(name) {}
    std::string getName() const { return _name; }

private:
    std::string _name;
};

class PlatformEntity: public Entity, public SomeClass
{
public:
    PlatformEntity(): Entity(EN_PLATFORM) {}
};
然后进行初始化,如下所示:

int main()
{
    PlatformEntity platform;
    std::vector<PlatformEntity> platforms(platform);
    std::vector<PlayerEntity> players;
    players.emplace_back("Bob");
    players.emplace_back("Alice");
    players.emplace_back("Ook");
}
intmain()
{
平台实体平台;
std::向量平台(平台);
向量机;
球员。回防(“鲍勃”);
玩家。安置回(“爱丽丝”);
玩家。安置回(“Ook”);
}
然后,从用户数据进行的访问可能如下所示:

class Entity
{
public:
    enum Type {
        EN_NONE = 0,
        EN_PLAYER = 1,
        EN_PLATFORM,
        EN_GROUND,
        EN_OBSTACLE,
        EN_OTHER
    };

    Type getType() { return _type; }

protected:
    Entity(Type type): _type(type) {}

private:
    const Type _type;
};
// bodyUserDataA and bodyUserDataB are both void*
Entity* const EA = static_cast<Entity*>(bodyUserDataA);
Entity* const EB = static_cast<Entity*>(bodyUserDataB);

switch (EA->getType())
{
    case Entity::EN_PLAYER:
    {
        PlayerEntity* player = static_cast<PlayerEntity*>(EA);
        std::cout << "Found player: " << player->getName();
        break;
    }
    case Entity::EN_OTHER:
        ...
    default:
        break;
}
//bodyUserDataA和bodyUserDataB都是空的*
实体*const EA=静态_cast(bodyUserDataA);
实体*const EB=静态_转换(bodyUserDataB);
开关(EA->getType())
{
案例实体::EN_播放器:
{
玩家性*玩家=静态施法(EA);

std::您可能感兴趣。此强制转换设计用于在继承相关的类型之间进行强制转换。这就是问题所在,我不能使用动态\u强制转换,给了我一个错误“指针动态\u强制转换的操作数必须是指向完整类名的指针”…什么是
EntityInfo
?我们不知道它与基类或派生类A/B.TL的关系;DR:?@RyanP抱歉,我已修复。