#include struct Room { Room* north; Room* east; Room* south; Room* west; }; class Maze { public: Maze(Room* entrance) : entrance{entrance} {} /* Everything but the destructor is given (except any includes needed for the destructor) */ ~Maze() { std::set visited { }; remove_rooms(entrance, visited); } Maze(Maze const& other) = delete; Maze(Maze && other) = delete; Maze operator=(Maze const& other) = delete; Maze operator=(Maze && other) = delete; private: void remove_rooms(Room* room, std::set& visited) { if (room == nullptr) return; if (visited.count(room) > 0) return; visited.insert(room); remove_rooms(room->north, visited); remove_rooms(room->east, visited); remove_rooms(room->south, visited); remove_rooms(room->west, visited); delete room; } Room* entrance; }; Room* setup_rooms() { Room* r1{ new Room{} }; Room* r2{ new Room{} }; Room* r3{ new Room{} }; Room* r4{ new Room{} }; Room* r5{ new Room{} }; Room* r6{ new Room{} }; r1->east=r2; r1->south=r4; r2->east=r3; r2->south=r5; r2->west=r1; r3->south=r6; r3->west=r2; r4->north=r1; r4->east=r5; r5->north=r2; r5->west=r4; r6->north=r3; return r1; } int main() { Maze maze{setup_rooms()}; }