5

次の違いは何ですか:

namespace Ui
{
     class T;
}
class T
{
     //some content
}; 

namespace Ui
{
     class T 
     {
          //some content
     };
}

私は Qt Creator を使用しており、最初の構成は Qt Gui アプリケーション用に生成されたデフォルト コードで使用されています。サンプル プロジェクトには 2 つのクラスあります

class T: public Q
{
private:
          Ui::T *pointer;
}

そのような構造の目的は何ですか?MainWindow クラスに MyDialog クラスへのポインターも含まれている場合、そのポインターにUi::修飾子を含めることはできません。

private:
          Ui::MainWindow *ui;
          MyDialog *mDialog;

なんで ?

4

2 に答える 2

4

興味深い質問です。これまでこの事実に気付きませんでした。おそらく、通常はコードで Ui オブジェクトを構築することを好むためです。

とにかく、構造は「サービス」クラス名の生成を回避するために使用されます: たとえば、私の実際の .h から

namespace Ui {
class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT
...
private:
    Ui::Dialog *ui;
}

Ui::Dialog *ui;: が最上位の宣言 (名前空間 Ui 内) によって転送される実際のクラスであることに注意してください。したがって、QtCreator は任意のシンボルを作成することを避けます。

いいトリックだと思います。

その転送されたクラスは、GUI のランタイム構築に必要な厄介な詳細を隠します。たとえば、ビルド ディレクトリに .h (私の場合は ui_dialog.h) が含まれています。

QT_BEGIN_NAMESPACE

class Ui_Dialog
{
public:
    QVBoxLayout *verticalLayout;
    QTabWidget *tabWidget;
...
};

namespace Ui {
    class Dialog: public Ui_Dialog {};
} // namespace Ui

QT_END_NAMESPACE
于 2013-10-10T19:55:32.320 に答える
0

名前空間は、クラスのエイリアシングからコードを保護するためにあります。クラスを名前空間でラップすると、その名前空間を使用してのみアクセスできます。したがって、「クラス t」は「名前空間::クラス t」と同じではありません。

于 2013-10-10T18:51:45.090 に答える