gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:07:29 24 4
gpt4 key购买 nike

在我的头文件中我有:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com