QT 程式入口總會見到 QApplication app(argc, argv);。QApplication 繼承 QCoreApplication,後者繼承 QObject(QT 根基類)。
class Q_CORE_EXPORT QCoreApplication : public QObject {
static QCoreApplication* self;
static QCoreApplication* instance() { return self; }
// ...
};
#define qApp QCoreApplication::instance()
self 為私有靜態指針,構造函數中 init() 賦值 self = this。qApp 宏獲取全局唯一實例指針,方便主函數外部使用 app 物件。QCoreApplication::QCoreApplication(int& argc, char** argv)
: QObject(*new QCoreApplicationPrivate(argc, argv)) {
init();
QCoreApplicationPrivate::eventDispatcher->startingUp();
// 平台相關初始化...
}
void QCoreApplication::init() { QCoreApplication::self = this; }
#define qApp (static_cast(QCoreApplication::instance()))
self,但需 static_cast 轉為派生類指針。QApplication)。不是。 構造函數為 public,同一作用域內可重複構造(前一個析構後)。QT 文檔所謂「只允許創建一個」指「同一函數/作用域內同時只能存在一個」,非經典單例模式(私有構造+靜態獲取)。
for (int i = 0; i < 3; ++i) { QCoreApplication app; } // 合法,前一個已析構
本文出自「賣萌程序員」博客,轉載請保留出處:https://7677869.blog.51cto.com/7667869/1288735