让我把我的问题说得更清楚一点:
我有一个游戏类,它在程序开始时被实例化,只有在程序生命周期结束时才被销毁。
我有一个"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从while循环每个帧调用,以检测更新和用户输入。此外,对startMenu的任何更新都会被记录下来,然后用单独的方法绘制(Game::render())来反映用户的输入。在循环的每一次迭代中,我都不能是reInitializing startMenu。
游戏::update()(调用main,inside event while循环)
void Game::update() {
switch(gameState)
{
case 0:
runStartMenu();
break;
case *n*... //other game screens...
}
}然后我的绘图游戏::render()函数:(从main调用,inside event then循环调用)
Game::render()
switch(gameState)
{
case 0:
drawStartMenu();
break;
case *n*... //other game screens...
}
}谢谢。
发布于 2020-07-02 17:19:54
编辑:根据请求,允许在菜单运行时执行其他任务的后台执行
作为一般规则,您不应该在智能指针上下文之外操作原始new和delete运算符。对于您的用例,绝对可以使用静态分配,而动态分配并没有带来任何优势,因此我建议您以简单的方式设计它,如下所示:
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
} 然后,调用者可以实现菜单选择逻辑并启动游戏!
https://stackoverflow.com/questions/62701617
复制相似问题