c++再次初始化非指针对象

标签 c++

在我的头文件中我有:

class Game
{
private:
    string _name;
    Level _currentLevel;
public:
    Game();
    ~Game();
    void setName();
    void run();
};

在我的 cpp 文件中我有我的运行函数:

void Game::run()
{

    bool finished = false;
    string input;
    while (!finished)
    {
        // get input
        std::cout << "Enter a command: \n";
        std::getline(std::cin, input);
        if (input == "quit")
        {
            finished = true;
        }
        else if (input == "new")
        {
            Level _currentLevel;
        }
        else if (input == "print")
        {
            _currentLevel.printMap();
        }
        else
        {
            std::cout << "Unknown command! \n";
        }


    }
}

Level的构造函数和printmap方法

Level::Level()
{
    _width = RandomGenerator::Instance()->getRandom(6, 10);
    _height = RandomGenerator::Instance()->getRandom(6, 10);
    for (int y = 0; y < _height; y++)
    {
        for (int x = 0; x < _width; x++)
        {
            addRoom(x, y);
        }
    }
}

void Level::printMap()
{
    for (int y = 0; y < _height; y++)
    {
        for (int x = 0; x < _width; x++)
        {
            if (x != 0)
                cout << " - ";
            cout  << _map[coordinate(x, y)].getSize();
        }
        cout << "\n";
    }
}

但是,当我键入 new 时,它会运行 Level _currentLevel; (创建一个新的非指针对象),对象不改变。我可以看到当我运行 printmap 时它并没有改变 level 的值(它打印了一个在 Level 构造函数中创建的具有 30 个随机值的 map )。在调试 Level 构造函数中 _height 值的变化时。应如何从我的 Game 类更新 _currentLevel 的值?

最佳答案

您的新 block 创建了一个本地堆栈变量,该变量恰好与您的实例变量 (_currentLevel) 同名。它不会覆盖实例变量,这就是什么都没有改变的原因。

您有几个直接的选择:

  • 使用指针。我建议使用 shared_ptr,这样您就不必担心自行释放内存。

  • 扩展 Level 以具有 Initialize 功能。构造函数可以调用它,或者如果您想重新初始化现有变量,您可以稍后从其他代码调用它。

  • 复制一个新的局部变量到实例变量。

就个人而言,我建议使用指针,但两者都有效。

关于c++再次初始化非指针对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34700264/

相关文章:

c++ - 在 C++ 中使用多线程进行快速排序

c++ - 实现哈希表

c++ - 在 Mac OS X 上使用不同的编译器构建 boost

c++ - 麻烦用 true 初始化 boolean 数组

c++ - 在 C++ 中迭代枚举类的常用方法是什么?

c++ - 这些参数分配在哪里

c++ - 将 _msize 与 new[] 一起使用安全吗?

c++ - 将 cv::Mat 传递给 labview

c++ - 返回值与实际返回值不一样?

c++ - 为应用程序设置默认光标