W klasie CFood oraz w klasie CSnake konstruktory wyglądają mniej więcej tak:
CFood::CFood(){
m_PositionFood->nX = ( rand () % MAP_X ) + 1;
m_PositionFood->nY = ( rand () % MAP_Y ) + 1;
}
Odwołujesz się do zmiennej bez przydzielenia jej pamięci. Powinieneś dodać jeszcze przed tymi dwoma wierszami:
m_PositionFood() = new Position2D()
Błędów jest o wiele więcej jednakże po powyższych zmianach program się przynajmniej uruchamia.
Co do rysowania ogona. Głowa pobiera pozycje od ciebie (kierujesz nią za pomocą strzałek). Pierwszy dodatkowy element węża pobiera dane od głowy, drugi element od tego pierwszego, trzeci od drugiego itd.