我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?

I have an object that will be instantiated the entire duration of the program, but a class member that will not, should I dynamically allocate it?

本文关键字:成员 一个 动态分配 我应该 实例化 一个对象 程序 持续时间      更新时间:2023-10-16

让我再冲出我的问题:

我有一个 Game 类,它在程序开始时实例化,仅在程序生命周期结束时销毁。

我的 Game 类中有一个"StartMenu"成员对象,我显然希望在游戏生命周期开始时可以使用该对象,但在用户启动游戏后不会占用内存。(根本没有理由这样做(。

我当前的解决方案是将 StartMenu 指针声明为成员,通过从构造函数调用的方法(或在必要时在其他地方(为其动态分配内存,然后在用户希望玩游戏时将其删除。 这是一个好的做法解决方案吗?是否应该更改设计,或者是否有或更多标准处理"开始菜单"的方式?

相关代码:

Class Game 
{
private:
StartMenu* startMenu_ptr;
//Other  Game Vars
}

初始 化

Game::initStartMenu() {
startMenu_ptr = new StartMenu(); 
}

删除

Game::runStartMenu() {
if(startMenu_ptr->getOption()==1) {
delete startMenu_ptr;
startMenu_ptr = nullptr;
}

编辑:需要更多详细信息。 runStartMenu 从每帧循环一次调用,以检测更新和用户输入。此外,对 startMenu 的任何更新都会被记录下来,然后在单独的方法(Game::render(((中绘制以反映用户输入。我不能在循环的每次迭代中重新初始化 startMenu。

游戏::update(( (从主事件调用,内部事件而循环(

void Game::update() {
switch(gameState)
{
case 0:
runStartMenu();
break;
case *n*... //other game screens...
}
}

然后我的绘制游戏::render(( 函数:(从主事件调用,内部事件而循环(

Game::render()
switch(gameState)
{
case 0:
drawStartMenu();
break;
case *n*... //other game screens...
}
}

谢谢。

编辑:根据要求,允许在菜单运行时后台执行其他任务

作为一般规则,切勿在智能指针的上下文之外操作原始newdelete运算符。对于您的用例,您绝对可以使用静态分配,动态分配不会带来任何优势,因此我建议您以直接的方式设计它,如下所示:

StartMenu::choice_t choice;
Game::runStartMenu() {
auto menuThread = std::thread([](){
auto menu = StartMenu{/* options */};
// for example :
choice = menu.show(); 
}); // the menu memory gets freed here 

menuThread.join(); // wait for execution end
// choice handling logic
} 

然后,调用方可以实现菜单选择逻辑并开始游戏!

相关文章: