析构函数在类中运行时退出程序

时间:2013-12-21 02:33:28

标签: c++ sdl

我试图让我的程序在调用对象的析构函数时结束。它的部分工作方式是因为对象被删除但程序仍在运行。有没有办法做到这一点?或者这是一种错误的方式,以更好的方式做到这一点?谢谢你的帮助!非常感谢!

这是主要功能

#include "engine.h"

int main(int argc, char* argv[]) {
    bool running = true;
    Engine engine;
    engine.init();

    while(running == true) {
        engine.update();
        engine.render();
    }
    return 0;
}

这是对象.cpp

#include "engine.h"

Engine::Engine() {
}

void Engine::init() {
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_CreateWindow("Engine", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 960, 540, SDL_WINDOW_SHOWN);
    renderer = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);

    if(screen == NULL) {
        std::cout << "Could not create window: " << SDL_GetError() <<  std::endl;
    }
}

void Engine::update(){
    SDL_PollEvent(&event);
    if(event.type == SDL_QUIT) {
        delete this;
    }
}

void Engine::render() {
    SDL_RenderClear(renderer);
    SDL_RenderPresent(renderer);
}

Engine::~Engine() {
    SDL_Quit();
}

2 个答案:

答案 0 :(得分:2)

使用异常可能是退出深层嵌套代码的最优雅方式,因为它可以确保堆栈被展开并且所有内容都被正确销毁。我将仅为此异常定义一个空类型,可能嵌套在Engine

class Engine {
public:
  // ...
  struct ExitException {};
  // ...
};

并将其从Engine::update扔到退出​​:

void Engine::update(){
    SDL_PollEvent(&event);
    if(event.type == SDL_QUIT) {
        throw ExitException();
    }
}

你可以在main中抓住它来干净地退出:

int main() {
    Engine engine;
    engine.init();

    try {
        while(true) {
            engine.update();
            engine.render();
        }
    } catch(Engine::ExitException&) {}
}

答案 1 :(得分:0)

如果要在调用Engine析构函数时结束程序,可以使用exit();

快速浏览this以获取更多信息。