2017-01-17 3 views
0

Je rencontre un problème pour récupérer la valeur d'énumération correcte de BaseClass.Définition de la valeur de la classe Dérivée, tout en accédant à la même valeur à partir de la classe de base

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

et

L'initialisation va comme ceci

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

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

qui est placé dans une liste de vecteur différent correspoinding à qu'ENUM.

Cependant, je suis obligé d'utiliser void* à faire static_casts chats ...

comme ceci:

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

Et je suis en train de récupérer à l'aide EA->getEntityId() et EB->getEntityId() pour que je puisse vérifier que l'on est EN_PLAYER, lequel est EN_GROUND et ainsi de suite. Alors je pourrais aller de la base vers la classe dérivée et faire d'autres choses avec.

Essayé en utilisant avec virtuel, mais en quelque sorte je reçois 2 copies de _EntityID, qui peut être identique ou DIFFERENT entre mon Derivered et BaseClass de cet objet. De plus, je ne peux pas tout de suite passer dans DeriveredClass, car la vérification du code serait énorme, en raison de nombreux types de DeriveredClass'es (DeriveredClassA, DeriveredClassB, DeriveredClassC, DeriveredClassD) avec leur liste de vecteurs correspondante.

Ma question est la suivante: Comment ai-je besoin d'installer correctement les classes Base et Derivered, pour pouvoir accéder à _EntityID de Baseclass qui est le même que DerivededClass? Mon principal problème est peut-être que j'ai utilisé des fonctions virtuellement incorectly, donc je suis parti par défaut pour comprendre mon problème.

P.S. C'est principalement mon problème C++, d'autres tags sont ajoutés car j'utilise un moteur de jeu et un moteur physique pour ce cas.

+0

Vous pouvez être intéressé par [dynamic_cast] (http://en.cppreference.com/w/cpp/language/dynamic_cast). Cette distribution est conçue pour fusionner des types liés par héritage. –

+0

C'est le point, je ne peux pas utiliser dynamic_casts, me donne une erreur de "l'opérande d'un pointeur dynamic_cast doit être un pointeur vers un nom de classe complet" .... – Dinamix

+0

qu'est-ce qu'un 'EntityInfo'? Nous ne savons pas comment cela se rapporte à BaseClass ou DerivedClassA/B. – RyanP

Répondre

1

Je crois que vous voulez que votre code ressemble plus à ceci:

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

ensuite vos classes dérivées et l'utilisation de cette base serait plus comme:

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

L'initialisation se fait alors comme :

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

Accès à partir de données utilisateur pourrait alors ressembler à ceci:

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