他們只需要找到其他蛇和食物的位置,當他們的移動功能被調用時。在初始化時不需要知道它們的存在!
因此,您可以收集蛇和食物的集合,並將這些集合的引用傳遞給任何新創建的蛇和食物。首先創建這些集合。
你可以通過另一個類來做到這一點,也許,它也可以作爲一個工廠。
class GameManager;
class Snake
{
friend class GameManager;
public:
int getX() { return _x; }
int getY() { return _y; }
void setPosition(int x, y) { /* ... */ }
private:
Snake(GameManager* manager, int x, int y) : _manager(manager), _x(x), _y(y) {}
GameManager* _manager;
int _x, _y;
};
class GameManager
{
public:
const std::vector<Snake*>& Snakes() { return _snakes; }
Snake* SpawnSnake(int x, int y)
{
Snake* newSnake = new Snake(this, x, y);
snakes.push_back(newSnake);
return snake;
}
private:
std::vector<Snake*> _snakes;
};
(只是一個例子,代碼沒有經過測試,看它是否實際編譯。E & OE)
GameManager
確保所有創建的蛇都在蛇矢量中找到,因爲Snake
構造函數是私有的。每條蛇可以調用_manager.Snakes()
獲得一個包含遊戲中所有其他蛇的矢量,然後它可以單獨查詢它們的位置。這很容易推廣到支持食品。
這與其他答案中建議的「構造初始化」模式相比有一個小優點,它可以確保當你得到一個新的Snake
對象時,它實際上已經可以使用了......這個例子不完全是RAII,但它需要最少的努力才能使其具有合理的異常安全性。
注:若沒有動態分配可以使用的指針。 –