Я разрабатываю своего рода теоретическую систему частиц, которая создает сложные частицы (объекты) из базовых строительных блоков (классов). Чтобы проиллюстрировать это, рассмотрим следующий набор классов:
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 ++ не позволяет создавать классы времени выполнения, поэтому автоматизация во время выполнения выходит за рамки.
Буду признателен за любые полезные советы о том, как я могу автоматизировать это!
Не зная слишком много деталей, кажется, что композиция — это путь (в отличие от наследования).
Создайте несколько классов частиц, все они наследуются от одного базового класса:
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, которая возвращает число, зависящее от упорядочения его частиц.
Теперь весь ваш код заказа может быть определен во время выполнения.
Других решений пока нет …