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

Posted

技术标签:

【中文标题】有没有办法将两个或多个不同的类链接到一个类中(然后在向量上使用)?【英文标题】:Is there any way to link two or more different classes into one class (and later use on a vector)? 【发布时间】:2019-12-14 14:30:32 【问题描述】:

所以我基本上是在尝试链接两个不同的类并在同一个向量中使用它们。 例如,如果我有一个名为“CPlayer”的类和另一个名为“Cenemy”的类,它们具有不同的元素但原理相同,我如何将它可能链接到一个名为“CEntity”的类中?我想避免乱七八糟的代码。

【问题讨论】:

你可能想复习你最喜欢的 C++ 教科书中关于继承多态的章节。 【参考方案1】:

@IgorTandetnik 是对的,多态性 是解决方案。我在此处发布了一个描述性的 sn-p,以在您学习这个有趣的主题时指导您的想法。

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();

【讨论】:

下面有另一个人回答,但总而言之,我发现您的回答要好一些(更简单可靠)。真诚地感谢你。 :) @HolyRandom 感谢您提出问题..很高兴我们能提供帮助。【参考方案2】:

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&lt;enum Entity, std::any&gt;的向量。

如果变体是 valueless_by_exception,则返回 variant_npos。

【讨论】:

以上是关于有没有办法将两个或多个不同的类链接到一个类中(然后在向量上使用)?的主要内容,如果未能解决你的问题,请参考以下文章

将单独类中的多个组件添加到另一个类中的 JFrame

如何将场景绑定到cucumber java中的特定步骤类

一个xib,多个类在iOS中没有继承?

如何在eclipse或netbeans中运行多个控制台

如何为同一服务使用@Autowired 注解两个或多个不同的组件类?

使用列表将数据网格绑定到两个不同的类?