有没有办法将两个或多个不同的类链接到一个类中(稍后在向量上使用)?
Is there any way to link two or more different classes into one class (and later use on a vector)?
所以我基本上试图链接两个不同的类,并在同一个向量中使用它们。 例如,如果我有一个名为"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。
相关文章:
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为什么一个向量上的多线程操作很慢
- 将一个向量插入另一个向量的某个位置
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++ STD 函数运算符:有没有一种方法可以通过函数将一个向量映射到另一个向量上?
- 将向量之间的数字放在另一个向量之间<vector>>如果两个数字的差值为 1
- 如何在不复制的情况下将一个向量移动到另一个向量中
- 使用 std::transform 将向量向量 (a) 添加到另一个向量向量 (b)
- 如何按另一个向量的方向调整一个向量?
- 将字符向量复制到另一个向量
- 制作一对共享指针并推送一个向量
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- 大家好,当一个类有一个向量作为它的数据成员时,为什么它的大小总是24?
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 如何将所有指针从一个向量移动到另一个向量?
- 将一个向量映射到不同的对,即使向量映射到每对时是不同的?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- 使用步骤c++构建一个向量
- 如何从另一个向量中的另一个第一元素减去向量中的第一元素
- 将一个向量对放在一个无序映射与一个映射中