从Derivered类设置值,同时从基类访问相同的值

时间:2017-01-17 16:18:48

标签: c++ box2d cocos2d-x-3.0

我遇到了检索BaseClass正确枚举值的问题。

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;
};

class DeriveredClassA : public SomeClass, public BaseClass {....};
class DeriveredClassB : public SomeClass, public BaseClass {....};

初始化就像这样

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

DeriveredClassB->setEntityId(BaseClass::EntityId::EN_OBSTACLE);

将其放入与该枚举相对应的不同矢量列表中。

但是,我被迫使用void*static_casts只猫......

像这样:

BaseClass* EA = static_cast<BaseClass*>(bodyUserDataA); //bodyUserDataA and bodyUserDataB are both void*
BaseClass* EB = static_cast<BaseClass*>(bodyUserDataB);

我正在尝试使用EA->getEntityId()EB->getEntityId()进行检索,因此我可以检查哪一个是EN_PLAYER,哪一个是EN_GROUND等等。那么我可以从基础上升到派生类和做其他事情。

尝试使用虚拟,但不知何故我收到了2个_EntityID副本,它可以是我的Derivered和该对象的BaseClass之间的相同或不同。

此外,由于许多不同类型的DeriveredClass(DeriveredClassA,DeriveredClassB,DeriveredClassC,DeriveredClassD)及其相应的矢量列表,因此我无法立即投入DeriveredClass,因为代码检查会很大。

我的问题是我需要如何正确设置Base和Derivered类,以便我可以从Baseclass访问_EntityID,这与DeriveredClass相同?我的主要问题可能是我使用了不正常的虚函数,所以我默认离开了解我的问题。

P.S。这主要是我的c ++问题,由于我在这种情况下使用的是游戏引擎和物理引擎,因此添加了其他标签。

1 个答案:

答案 0 :(得分:1)

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

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;
};

然后你的派生类和这个基础的用法更像是:

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");
}

用户数据的访问可能如下所示:

// 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;
}