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

时间:2016-01-09 23:38:21

标签: 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; (创建一个新的非指针对象),对象dosnt改变。我可以看到,当我运行printmap(打印一个包含在Level构造函数中创建的30个随机值的地图)时,它不会更改关卡的值。调试_height值时,Level构造函数会发生变化。如何从我的Game类更新_currentLevel的值?

2 个答案:

答案 0 :(得分:3)

您的新块会创建一个本地堆栈变量,该变量恰好与您的实例变量(_currentLevel)具有相同的名称。它不会覆盖实例变量,这就是为什么没有任何变化。

您有几个直截了当的选择:

  • 使用指针。我建议您使用shared_ptr,这样您就不必担心自己取消内存。

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

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

就个人而言,我建议使用指针,但要么有效。

答案 1 :(得分:0)

对于初学者来说,原型应该在头文件和源文件中的实现中。除此之外,在game :: run中,您声明了第二个本地_currentlevel,它隐藏了类变量。在构造函数之外,您永远不会修改类字段。

用this-&gt; _currentlevel = Level();

替换阴影线