从 Derived class 设置值,同时从 base class 访问相同的值
Setting value from Derivered class, while accesing same value from base class
我遇到了检索 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 等等。然后我可以 up-class 从 base 到 derivered class 并用它做其他事情。
尝试使用虚拟,但不知何故我收到了 _EntityID 的 2 个副本,在我的那个对象的派生类和 BaseClass 之间可以相同也可以不同。
此外,我不能立即转换为 DeriveredClass,因为代码检查会很庞大,因为有许多不同类型的 DeriveredClass(DeriveredClassA、DeriveredClassB、DeriveredClassC、DeriveredClassD)及其相应的向量列表。
我的问题是,我如何需要正确设置 Base 和 Derivered class,以便我可以从 Baseclass 访问与 DeriveredClass 相同的 _EntityID?我的主要问题可能是我使用了不正确的虚拟函数,所以我保留默认值以了解我的问题。
P.S。这主要是我的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) {}
};
然后初始化如下:
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");
}
来自 user-data 的访问可能如下所示:
// 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;
}
我遇到了检索 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 等等。然后我可以 up-class 从 base 到 derivered class 并用它做其他事情。
尝试使用虚拟,但不知何故我收到了 _EntityID 的 2 个副本,在我的那个对象的派生类和 BaseClass 之间可以相同也可以不同。
此外,我不能立即转换为 DeriveredClass,因为代码检查会很庞大,因为有许多不同类型的 DeriveredClass(DeriveredClassA、DeriveredClassB、DeriveredClassC、DeriveredClassD)及其相应的向量列表。
我的问题是,我如何需要正确设置 Base 和 Derivered class,以便我可以从 Baseclass 访问与 DeriveredClass 相同的 _EntityID?我的主要问题可能是我使用了不正确的虚拟函数,所以我保留默认值以了解我的问题。
P.S。这主要是我的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) {}
};
然后初始化如下:
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");
}
来自 user-data 的访问可能如下所示:
// 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;
}