2016-08-06 37 views
3

, wenn Sie ein Standard QT5 Widget-Anwendung zu erstellen, ist dies der Standardcode für die QMainWindow Unterklasse:Wie ist dieser Qt-Boilerplate-Konstruktor nicht rekursiv? So

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 

private: 
    Ui::MainWindow *ui; 
}; 

#endif // MAINWINDOW_H 

mainwindow.cpp

#include "mainwindow.h" 
#include "ui_mainwindow.h" 

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

So ist die Klasse hat ein Beispiel für sich selbst, das scheint in Ordnung zu sein. Aber dann hätte diese Instanz selbst eine Instanz, die wiederum eine Instanz von sich selbst hätte ...

Wie führt dies nicht zu einer unendlichen Rekursion von Klassen, die sich selbst enthalten?

Antwort

3

Dies sind nicht die gleichen Klassen. MainWindow wird im globalen Namespace deklariert, während das ui Mitglied vom Typ Ui::MainWindow ist, das im Namespace Ui deklariert ist. Sie können die Deklaration dieser Klasse sehen, indem Sie ui_mainwindow.h betrachten.

Da es sich um zwei verschiedene Typen handelt, findet keine Rekursion statt, da MainWindow::~MainWindow() nicht von selbst aufgerufen wird.

+0

Ok, das macht Sinn, aber wo ist die Definition der UI-Klasse? Anders als diese beiden Dateien gibt es nur die Hauptdatei und eine '.ui' Datei, die nur die Benutzeroberfläche des Fensters im XML-Format ist. – rcplusplus

+1

Nach RTFM habe ich herausgefunden, dass' Ui :: MainWindow' automatisch vom 'uic' generiert wird Werkzeug, das '.ui' Dateien in C++ Code kompiliert. So hat deine Antwort alle Zweifel aus meinem Kopf entfernt! Es ist schon eine Weile her, seit ich C++ benutzt habe :) – rcplusplus