我如何仅一次或一次创建一个对象

How do I create an object once and only once?

本文关键字:一次 创建 一个对象 何仅一      更新时间:2023-10-16

我希望一次和一次实例化的水果类,因此地图上只有一个水果对象。当蛇吃掉它时,它被称为攻击函数,并且存在旗帜再次被设置为假。我应该如何实施此行为?

水果。H

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的实例存储在您的"游戏状态"类中,其寿命为一个值。它的寿命将与游戏状态的终生相匹配。

  • 玩家收集水果时,只需增加蛇的长度,然后将水果移动到其他地方。无需创建/破坏对象。


伪代码:

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;
}

由于构造函数是私有的,因此只有班级的函数才能称呼它,并且由于您只有一种可以创建果实(实例((方法(的方法,所以它只会创建一个水果。

不要。

,如果您尝试强制执行任何一种 can ,则只会使您的程序复杂化并进行奇怪的设计。

而不是创建一个水果,而不再创建一个。