我正在开发一种从基本构建块(类)创建复合粒子(对象)的理论粒子系统。为了说明,请考虑以下一组类:
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 ++不允许创建运行时类,因此运行时的自动化会消失。
关于我如何实现自动化的任何有用的指示都将不胜感激!
答案 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类创建一个类似的函数,该函数返回一个依赖于粒子排序的数字。
现在,您可以在运行时确定所有与订单相关的代码。