【问题标题】:Understaning of static objects in main functionmain函数中静态对象的理解
【发布时间】:2016-10-18 12:58:31
【问题描述】:

我正在尝试构建应用程序,它将根据控制台参数选择它是 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();
}

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

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

【问题讨论】:

    标签: c++ qt oop static


    【解决方案1】:

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

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

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

    {
        int i = 3;
        ...
    }
    

    void f() {
        int x = 5232;
    }
    

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

    {
        static int i = 3;
        ...
    }
    

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

    【讨论】:

    • 谢谢大家,也会点赞,但没有足够的代表。
    【解决方案2】:

    因为当您的代码超出大括号时:“con”和“ui”对象将被销毁,因为如果它们不是静态的,它们的范围会受到大括号的限制。

    【讨论】:

    • 谢谢大家,也会点赞,但没有足够的代表
    【解决方案3】:

    将它们设为static 会延长所创建对象的生命周期,直到程序结束。

    当您没有它们 static 时,生命周期将在定义变量的范围的末尾结束。

    【讨论】:

    • 谢谢大家,也会点赞,但没有足够的代表
    【解决方案4】:

    如果对象不是static,它们将在其包含块的末尾(在结束})不再存在,并且将调用它们的析构函数。

    可能这些对象是以某种方式注册的,因此它们在app.exec() 的调用中使用。然后它们的析构函数将注销它们,因此无法使用。

    【讨论】:

    • 谢谢大家,也会点赞,但没有足够的代表
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 2011-05-20
    • 2013-05-28
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    相关资源
    最近更新 更多