我正在尝试构建应用程序,如果它将成为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;
}