我正在开发一种理论上的粒子系统,该系统从基本的构建基块(类)创建复合粒子(对象)。为了说明,请考虑以下类集:
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!
大得多所以我面临的两个明显的障碍是
任何有关如何实现此自动化的有用指示,将不胜感激!
在不知道太多细节的情况下,听起来好像要走组合(相对于继承)。
创建多个粒子类,所有这些粒子类都继承自同一基类:
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类创建一个类似的函数,该函数返回一个取决于其粒子顺序的数字。
现在可以在运行时确定所有与订单相关的代码。