基本的に、boolを返す仮想update()関数によって指示されたとおりにトラバースおよび削除される、リンクリストとして格納されたクラスに使用される基本クラスを作成しています。
これが最も効率的なケースであるかどうか疑問に思っています(特に単一のリンクリストである可能性があるという事実が好きです):
class Traversable
{
public:
Traversable();
virtual ~Traversable();
void traverse(Traversable** prevNext);
virtual bool update()=0;
protected:
private:
Traversable* next;
};
void Traversable::traverse(Traversable** prevNext)
{
if (!update()) /// Virtual function that returns a death flag
{ /// Death
if (next)
{
Traversable* localNext = next;
delete this;
localNext->traverse(prevNext);
}
else
{
*prevNext = NULL;
delete this;
}
}
else
{ /// This node stays alive, for now
*prevNext = this;
if (next)
{
next->traverse(&next);
}
}
}
リンクリストはNULLで終了することに注意してください。
次のトラバース関数が呼び出された後、ローカル変数への割り当て操作が慎重に行われないことで、末尾呼び出しを使用してこの関数を確実に使用できるようになると思います。誰かが私が間違ったことを見つけたり、少し複雑でないアプローチを提案したりできますか:p