来自有限基类集上的排列的多个c ++对象

时间:2016-03-06 08:03:40

标签: c++ class inheritance particle-system

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

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 ++不允许创建运行时类,因此运行时的自动化会消失。

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

1 个答案:

答案 0 :(得分: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;
};

现在,ParticleComposition中的任何函数都可以依赖于粒子的排序(通过运行时检查)。在粒子类中包含虚函数可能也很有用,它返回粒子的类型:

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类创建一个类似的函数,该函数返回一个依赖于粒子排序的数字。

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