C++ 如何一次性创建对象?
我希望fruit类一次实例化一次,并且一次只能实例化一次,这样地图上就只有一个fruit对象。当蛇吃掉它时,它的析构函数被调用,并且存在标志再次被设置为false。我应该如何实现这种行为 水果C++ 如何一次性创建对象?,c++,instantiation,C++,Instantiation,我希望fruit类一次实例化一次,并且一次只能实例化一次,这样地图上就只有一个fruit对象。当蛇吃掉它时,它的析构函数被调用,并且存在标志再次被设置为false。我应该如何实现这种行为 水果 class Fruit { protected: char fruit; bool exists; int fruitPosX; int fruitPosY; public: Fruit(); char getFruitType(); int get
class Fruit {
protected:
char fruit;
bool exists;
int fruitPosX;
int fruitPosY;
public:
Fruit();
char getFruitType();
int getFruitPosX();
int getFruitPosY();
bool getExistenceFlag();
void setExistenceFlag(bool value);
~Fruit();
};
map.cpp
void Map::displayEverythingOnMap(Snake& snake){
snakeBody* tmp = snake.firstNode;
while (tmp != NULL) {
gameArea[snake.getSnakePosX()][snake.getSnakePosY()] = tmp->bodyPart;
tmp = tmp->next;
}
Fruit* fruit = new Fruit;
fruit->setExistenceFlag(false);
if (fruit->getExistenceFlag() == false) {
gameArea[fruit->getFruitPosX()][fruit->getFruitPosY()] = fruit->getFruitType();
fruit->setExistenceFlag(true);
if ((fruit->getFruitPosX() == snake.getSnakePosX()) && (fruit->getFruitPosY() == snake.getSnakePosY())) {
delete fruit;
fruit->setExistenceFlag(false);
snake.grow();
}
}
}
我希望fruit类一次实例化一次,并且一次只能实例化一次,这样地图上就只有一个fruit对象 停止。在任何给定时间,地图中只有一个
fruit
实例,这对于单身汉来说是一个糟糕的用例。您不需要在对象的生存期内玩游戏:
- 只需将
的一个实例存储在“游戏状态”类中,该类的生存期作为一个值。其生存期将与游戏状态的生存期相匹配fruit
- 当玩家收集水果时,只需增加蛇的长度,然后将水果移到其他地方。无需创建/销毁对象
伪代码:
struct game_state
{
fruit _fruit;
// ...
game_state()
{
_fruit.position = get_random_location();
}
void update()
{
if(_player.position == _fruit.position)
{
grow();
_fruit.position = get_random_location();
}
}
};
你想要一个单身汉:
class Fruit {
protected:
char fruit;
bool exists;
int fruitPosX;
int fruitPosY;
public:
static Fruit& instance();
char getFruitType();
int getFruitPosX();
int getFruitPosY();
bool getExistenceFlag();
void setExistenceFlag(bool value);
private:
Fruit();
~Fruit();
};
Fruit& Fruit::instance() {
static Fruit _self;
return _self;
}
因为构造函数是私有的,所以只有类中的函数才能调用它,而且因为只有一个方法可以创建这个结果(instance()方法),所以它只能创建一个结果。永远不要
如果你试图强制执行在任何时候只能存在一个水果,你只会使你的程序复杂化并做出一个奇怪的设计
相反,只需创建一个水果,不要再创建更多。不要执行
Fruit->setExistenceFlag(false)代码>后删除水果代码>因为它将引发异常。实际上,您可以通过使您的水果成为Map
类的成员来实现这一点,并根据需要创建和删除它,即在构建Map
时创建它,在蛇吃掉它时删除它,然后重新创建它。从根本上说,您可能只需更改水果类,使其具有REGENATE
或refresh
等风格的方法,当蛇吃掉水果时,您可以调用该方法,从而使其在地图上移动。我是否应该改为使用静态变量?如果是,我应该如何实现它?你的意思是“因此地图上只有一个水果对象”的可能重复,那么地图对象应该拥有一个水果对象?