Namensräume werden anders gehandhabt als in standart C++?



  • Hallo,

    ich wunder mich gerade warum folgendes mit Qt gültig ist(was steht weiter unten). Es handelt sich Quelldateien die von Qt Creator bei der erstellung einer Qt Gui Application erzeugt wurden.

    Insgesamt 4 Files. Eine für das Layout
    main.cpp

    #include <QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    
    }
    

    die mainwindow.h und die mainwindow.cpp

    #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
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    

    Und die mainwindow.ui Datei:

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget"/>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>400</width>
         <height>29</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections/>
    </ui>
    

    Die Klasse MainWindow die in mainwindow.h deklariert wurde erbt ja von QMainWindow. Soweit so gut. Vor der Klassendeklaration steht aber auch noch

    namespace Ui {
    class MainWindow;
    }
    

    Obwohl sich diese Klasse in einem Namensbereich befindet kann der Zeiger UI::MainWindow* ui; in MainWindow Funktionen und Objekte aus der MainWindow Klasse aufrufen. Letztens wollte ich das mal ohne Qt ausprobieren. Doch dies funktionierte nicht. Ich verstehe warum es nicht in standart C++ geht aber ich verstehe nicht warum es in Qt mit entsprechenden Compileroptionen geht.
    Hier quasi das gleiche nur in standart C++
    a.h

    #ifndef A_H
    #define A_H
    
    struct A
    {
        A();
        int a;
    };
    #endif // A_H
    

    display.h

    #ifndef A_H
    #define A_H
    
    struct A
    {
        A();
        int a;
    };
    #endif // A_H
    

    a.cpp

    #include "a.h"
    
    A::A(): a(0){ }
    

    display.cpp

    #include "display.h"
    
    MainWindow::MainWindow(): ui(new Ui::MainWindow) //ui kann nach meinem Kentnissstand garnicht initialisiert werden weil Ui::MainWindow garnicht definiert wurde.
                                                     //Deshalb auch einen Fehler zur Kompilierungszeit
    {
    
    }
    
    MainWindow::~MainWindow() { delete ui; }
    

    main.cpp

    #include "display.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
        return 0;
    }
    


  • Ich vermisse die "ui_mainwindow.h"
    Die ist klar, daß MainWindow und und Ui::MainWindow zwei verschiedene Klassen sind?



  • Die ist klar, daß MainWindow und und Ui::MainWindow zwei verschiedene Klassen sind?

    Ja ist mir klar.

    Ich vermisse die "ui_mainwindow.h"

    Danke für den Hinweis. Ich hab sie mir angeguckt jetzt ist alles klar. Ich bin noch relativ neu was Qt angeht und hab die ui_mainwindow.h" Datei die ja bei der Kompilierung neu erzeugt wird völlig vergessen.


Log in to reply