我正在尝试构建应用程序,如果它将成为gui应用程序或控制台,则将根据控制台参数选择该应用程序。

int main(int argc, char *argv[])
 {
    QApplication app(argc, argv);

    QCommandLineParser parser;
    parser.setApplicationDescription("Test");
    parser.addHelpOption();
    parser.addVersionOption();
    QCommandLineOption guiOption(QStringList() << "g" << "gui", "Gui");
    parser.addOption(guiOption);
    parser.process(app);

    bool isGUI = parser.isSet(guiOption);

    APPstub stub(0,isGUI);


if (isGUI) {                //GUI APP
    static APP_Window ui(&stub);   ////*****THIS
    ui.show();
}
else {                      // CONSOLE APP
    static APP_Console con(&stub);  ////*****THIS
    con.showMenu();
    }

    return app.exec();
}


我发现我需要在condition(//// ***** THIS)中创建的那些对象
需要是静态的,但我不明白为什么?
问题是:当我在条件之外有例如APP_Window ui(&stub)时,它可以工作并显示gui。
如果我将其放在条件内,Window会弹出并迅速消失。

我对此感到困惑...您能帮我理解这个问题吗?
谢谢 :)

最佳答案

如果未声明为静态,则APP_Window对象位于声明该对象的{}块的本地。一旦位于块之外,就将对象释放。任何本地对象都分配在堆栈上,一旦到达该块的末尾,编译器会自动释放该本地对象。

在{}块(或函数)中声明为静态的对象实际上是具有局部可见性的全局对象。因此,它是持久的,直到应用程序退出。

例如,这些是局部变量,仅在定义它们的块中可见且有效:

{
    int i = 3;
    ...
}


要么

void f() {
    int x = 5232;
}


现在这些变量是全局变量,尽管它们只有局部范围(在声明它们的块中):

{
    static int i = 3;
    ...
}


要么

void f() {
    static int x = 5232;
}

07-24 09:49
查看更多