c++ - 我有一个将在程序的整个持续时间内实例化的对象,但是一个不会实例化的类成员,我应该动态分配它吗?
问题描述
让我再次提出我的问题:
我有一个 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 在每帧的 while 循环中被调用,以检测更新和用户输入。此外,对 startMenu 的任何更新都会被记录下来,然后在单独的方法 (Game::render()) 中绘制以反映用户输入。我不能在循环的每次迭代中重新初始化 startMenu。
Game::update() (从 main 调用,在事件 while 循环内)
void Game::update() {
switch(gameState)
{
case 0:
runStartMenu();
break;
case *n*... //other game screens...
}
}
然后是我的 draw Game::render() 函数:(从 main 调用,在事件 while 循环内)
Game::render()
switch(gameState)
{
case 0:
drawStartMenu();
break;
case *n*... //other game screens...
}
}
谢谢。
解决方案
编辑:根据要求,在菜单运行时允许后台执行其他任务
作为一般规则,您永远不应该在智能指针的上下文之外操作原始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
}
然后,调用者可以实现菜单选择逻辑并开始游戏!
推荐阅读
- flutter - Function 或 StatelessWidget 哪个最好?
- javascript - 在其他页面单击时如何更改状态?
- docker - 在 Google Cloud Build 上使用 Docker Buildkit
- python - 如何在python中绘制数据框的伽马分布
- java - 为什么在我输入内容之前 print 和 printf 不打印任何内容?
- java - 找不到方法'com.android.build.gradle.internal.variant.BaseVariantData.getOutputs()Ljava/util/List
- javascript - 为什么事件'fadein'在JS中运行两次?
- javascript - 可以通过玩笑逐渐增加覆盖范围吗?
- r - R:修改函数中定义的变量
- arduino - 我正在尝试做一个if,但无济于事