C++ 如何一次性创建对象?

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

我希望fruit类一次实例化一次,并且一次只能实例化一次,这样地图上就只有一个fruit对象。当蛇吃掉它时,它的析构函数被调用,并且存在标志再次被设置为false。我应该如何实现这种行为

水果

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
等风格的方法,当蛇吃掉水果时,您可以调用该方法,从而使其在地图上移动。我是否应该改为使用静态变量?如果是,我应该如何实现它?你的意思是“因此地图上只有一个水果对象”的可能重复,那么地图对象应该拥有一个水果对象?