2017-01-17 7 views
0

BaseClass 올바른 enum 값을 검색하는 데 문제가 있습니다. 기본 클래스에서 동일한 값에 액세스하면서 Derived 클래스의 값 설정

class DeriveredClassA : public SomeClass, public BaseClass {....}; 
class DeriveredClassB : public SomeClass, public 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; 
}; 

는 ENUM correspoinding에 다른 벡터리스트에 배치되어이

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

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

같이 진행한다.

그러나, 나는 static_casts 고양이 ...이처럼

void*를 사용하도록 강요하고 있습니다 :

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_PLAYER, EN_GROUND 등)입니다. 그러면 기본 클래스에서 deriver 클래스로 상향 클래스 할 수 있고 다른 클래스도 사용할 수 있습니다.

가상을 사용하여 시도했지만 어떻게 든 _EntityID의 사본 2 개를받습니다.이 사본은 동일하거나 다른 하나의 객체 인 Derivered와 BaseClass간에 다를 수 있습니다.

또한 DerivedClass'es (DeriveredClassA, DeriveredClassB, DeriveredClassC, DeriveredClassD)가 해당 벡터 목록과 함께 여러 가지 유형으로 인해 코드 검사가 거대하기 때문에 곧바로 DeriveredClass로 캐스팅 할 수 없습니다.

내 질문은 내가 DeriveredClass와 동일한 Baseclass에서 _EntityID에 액세스 할 수 있도록 Base와 Derived 클래스를 올바르게 설치해야하는 까닭입니다. 내 주요 문제는 incorectly 가상 함수를 사용하는 것이므로 기본적으로 내 문제를 이해할 수 있도록 남겨 두었습니다.

P. 이것은 주로 내 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; 
}; 

을 다음 파생 클래스와이 기본의 사용을 더 같이 될 것이다 :

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

초기화는 다음과 같이 이루어집니다

+0

[dynamic_cast] (http://en.cppreference.com/w/cpp/language/dynamic_cast)에 관심이있을 수 있습니다. 이 형변환은 상속에 의해 관련된 형간에 캐스트하도록 설계되었습니다. –

+0

그게 포인트 야, 나는 dynamic_casts를 사용할 수 없다. "포인터의 피연산자 dynamic_cast는 완전한 클래스 이름에 대한 포인터 여야한다."라는 오류를 준다. – Dinamix

+0

무엇이'EntityInfo'인가? 우리는 그것이 BaseClass 또는 DerivedClassA/B와 어떻게 관련이 있는지 알지 못합니다. – RyanP

답변

1

나는 당신이 당신의 코드를 더 같이 할 것을 믿는다 예 :

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