Ad esempio:
Codice:
class CycleMap
{
map<string, BaseCycle *> cycleMap;
public:
CycleMap()
{
map.push_back("MainCycle", new MainCycle());
map.push_back("Cycle1", new Cycle1());
map.push_back("Cycle2", new Cycle2());
map.push_back("Cycle3", new Cycle3());
}
};
class BaseCycle
{
BaseCycle(){};
virtual BaseCycle * run() = 0;
virtual bool continue() { return true; };
};
class MainCycle: public BaseCycle
{
public:
MainCycle(){};
virtual BaseCycle * MainCycle::run()
{
do
{
state = state.run();
}
while(state.continue())
}
virtual bool continue() { return false; };
};
class Cycle1: public BaseCycle
{
public:
Cycle1() {};
virtual BaseCycle * run()
{
BaseCycle * next;
do
{
someThing();
if(condition)
next = cycleMap["Cycle2"].run();
}
while(next == this);
return next;
}
};
class Cycle2: public BaseCycle
{
public:
Cycle2() {};
virtual BaseCycle * run()
{
BaseCycle * next;
do
{
someThingOther();
if(condition)
next = cycleMap["Cycle3"].run();
else if(other condition)
next = cycleMap["Cycle4"].run();
else
next = cycleMap["MainCycle"].run();
}
while(next == this);
return next;
}
};
Tra l'altro è carino perché potresti scambiare dinamicamente l'ordine di esecuzione dei cicli...