有没有办法将两个或多个不同的类链接到一个类中(稍后在向量上使用)?

Is there any way to link two or more different classes into one class (and later use on a vector)?

本文关键字:一个 向量 两个 有没有 链接      更新时间:2023-10-16

所以我基本上试图链接两个不同的类,并在同一个向量中使用它们。 例如,如果我有一个名为"CPlayer"的类和另一个名为"CEnemy"的类,它们具有不同的元素但原理相同,我如何将其链接到一个名为"CEntity"的类中?我想避免混乱和硬代码。

@IgorTandetnik是正确的,多态性是解决方案。我在这里发布了一个描述性片段,以指导您学习这个有趣主题时的想法。

emum entity_type_enum { PLAYER, ENEMY };
struct CEntity
{
CEntity(void) { /**/ }
virtual ~CEntity(void) { /**/ }
virtual entity_type_enum id(void) = 0;
};
struct CPlayer : public CEntity
{
CPlayer(void) { /**/ }
virtual ~CPlayer(void) { /**/ }
entity_type_enum id(void) { return PLAYER; }
};
struct CEnemy : public CEntity
{
CEnemy(void) { /**/ }
virtual ~CEnemy(void) { /**/ }
entity_type_enum id(void) { return ENEMY; }
};
std::vector<CEntity*> objects;
objects.push_back(new CEnemy());
objects.push_back(new CPlayer());

获取实际玩家或敌人

auto *ptr = objects[0];
if (ptr->id() == ENEMY)
{
auto *E = dynamic_cast<CEnemy*>(ptr);
// do something with enemy...
}
if (ptr->id() == PLAYER)
{
auto *P = dynamic_cast<CPlayer*>(ptr);
// do something with player...
}

并清理

for (auto *ptr : objects) delete ptr;
objects.clear();

Igor Tandetnik基本上给了你一个很好的建议。但这里有一个简单的解决方案,不涉及继承,因此不涉及动态强制转换。如果您需要在没有多态的情况下存储Entities,有几种解决方案:

使用std::variant(需要 C++17(:

#include <variant>
class CPlayer 
{
// impl
};
class CEnemy 
{
// impl
};
using RefCPlayer = std::reference_wrapper<CPlayer>;
using RefCEnemy = std::reference_wrapper<CEnemy>;
using EntityWrapper = std::variant<RefCPlayer, RefCEnemy>;
void deduce(EntityWrapper e)
{
switch (e.index())
{
case 0:
std::cout << "This is a CPlayer entity" << std::endl;
break;
case 1:
std::cout << "This is a CEnemy entity" << std::endl;
break;
default:
break;
}
}
int main()
{
CPlayer p1;
CEnemy e1;
std::vector<EntityWrapper> entities;
entities.emplace_back(RefCPlayer(p1));
entities.emplace_back(RefCEnemy(e1));
EntityWrapper w1 = entities[0],
w2 = entities[1];
deduce(w1);
deduce(w2);
}

std::variant::index

返回多属性当前持有的替代项的从零开始的索引。

另一种方法是使用std::pair<enum Entity, std::any>的向量。

如果变体valueless_by_exception,则返回variant_npos。