少し循環依存の問題があります。それは問題なく動作しますが、見苦しいコードになります。これは、スネーク ゲームのコンテキストにあります。
SnakeSegments のベクトルを含むクラス Snake があり、それらの相互作用を管理します (たとえば、個別のエンティティとしてではなく、ユニットとして移動および成長します)。
SnakeSegment が Food オブジェクトと衝突すると、hasEaten メンバーが true に反転します。Snake は、基本的にこのメンバーに対して SnakeSegments を定期的に照会します。いずれかのクエリが正の値を返した場合 (つまり、1 つが食べ物に当たった)、ヘビはユニットとして成長します (つまり、頭を広げて尻尾を縮めます)。これはすべて問題ありませんが、SnakeSegment が食べ物にヒットすると、アラート (シグナル、割り込みなど) を Snake クラスに送信し、Snake クラスに成長を指示する、よりシグナルベースのアプローチを好みます。 . これは、すべてのセグメントをチェックして、Snake の Update 関数に醜いコードが含まれていないことを意味します。代わりに、Snake クラスに OnEat() 関数を用意します。
ただし、これは循環依存につながります。Snake には SnakeSegments のベクトルが含まれており、SnakeSegments には Snake& または Snake* メンバーがあり、食べるときに誰に警告するかを指示します。コードでは、基本的に Snake クラスを事前に宣言する必要があります。
class Snake;
class SnakeSegment
{
...
Snake* alertOnEat;
...
};
私のSnakeクラスは正常に動作します
#include "SnakeSegment.hpp"
class Snake
{
...
std::vector segments;
...
void OnEat();
...
};
これよりも優れたデザインはありますか?ここで発生する問題だけではないことに注意してください。同様の問題が多くの領域で発生します (たとえば、GameWorld には Snake メンバーが含まれており、Snake は GameWorld が死亡したときに警告を発します)。そのため、Snake と SnakeSegment に固有の解決策は私が探しているものではありません。