来自有限基类集的C ++对象的众多

问题描述 投票:0回答:1

我正在开发一种理论上的粒子系统,该系统从基本的构建基块(类)创建复合粒子(对象)。为了说明,请考虑以下类集:

class A; class B; class C; .... class Z;

这形成了复合粒子的基础。复合粒子定义为:

class C1C2...CN : public C1C2...C(N-1)

例如,

class AZB : public AZ, public B {};
class AZ : public A, public Z {};

一个约束是,以不同顺序构造的类是不等效的。换句话说:

ABZ != AZB != BAZ != BZA != ZAB != ZBA

现在,该系统可以产生大量可能的物体。对于N个基类,可能的排列总数约为N(N!)-1! -2! -...-(N-1)!。注意:它比N!

大得多

所以我面临的两个明显的障碍是

  1. 有太多的排列无法手工编写
  2. 据我所知,C ++不允许创建运行时类,因此运行时的自动化不在窗外。

任何有关如何实现此自动化的有用指示,将不胜感激!

c++ class inheritance particle-system
1个回答
0
投票

在不知道太多细节的情况下,听起来好像要走组合(相对于继承)。

创建多个粒子类,所有这些粒子类都继承自同一基类:

class Particle;

class A : public Particle; ...; class Z : public Particle;

然后创建一个包含粒子指针向量的粒子组成类:

class ParticleComposition
{
    private:
        vector<Particle*> m_particles;
};

如果需要,您还可以在ParticleComposition中使用一个ParticleComposition指针向量:

class ParticleComposition
{
    private:
        vector<Particle*> m_particles;
        vector<ParticleCompositon*> m_compositons;
};

现在,粒子合成中的任何函数都可以取决于粒子的顺序(通过运行时检查)。在粒子类中包含一个虚拟函数,该函数返回粒子的类型可能也很有用:

enum particleType{BASE, A, B, Z}; //and so on

class Particle
{
    public:
        virtual particleType getType(){return BASE;}
};

class A : public Particle
{
    public:
        virtual particleType getType(){return A;}
};

如果需要,可以为您的ParticleComposition类创建一个类似的函数,该函数返回一个取决于其粒子顺序的数字。

现在可以在运行时确定所有与订单相关的代码。

© www.soinside.com 2019 - 2024. All rights reserved.