У меня есть функция-член объекта, которая обычно используется итеративно, но иногда рекурсивно. Эта функция в основном следует по пути потока воды под гору, и при определенных условиях поток может расколоться. Чтобы поддержать случайную рекурсию, я должен поместить состояние объекта в стек и вытащить его после слов. В настоящее время я делаю это с использованием локальных переменных, но код выглядит ужасно. Я хотел бы написать члены PushState и PopState, но большинство реализаций, на которые я смотрел, не очень хороши. например использование члена стека в моем объекте, который в конечном итоге использует кучу, которая медленная и приводит к другим проблемам. _alloca не будет работать, так как кадр стека теряется при возврате функции push.
Существуют ли другие разумные способы выталкивания и выталкивания из стека, которые мне не хватает?
class CMyObject
{
enum Direction
{
left,right,branch,finished;
}
// state variables
double m_XPos,m_YPos;
void Navigate(double x,double y);
Direction GoLeft();
Direction GoLeft();
};
void CMyObject::Navigate(double x,double y)
{
m_XPos = x; m_YPos = y;
Direction d = GoLeft(x,y);
while(d != finished)
{
switch(d)
{
case left: d = GoLeft(); break;
case right: d = GoRight(); break;
case branch:
{
// push object state onto the stack
double temp_x = m_XPos; double temp_y = m_YPos;
Navigate(m_XPos,m_YPos);
// pop object state from the stack
m_XPos = temp_x; m_YPos = temp_x;
GoRight();
} break;
}
}
}