Помещение классов в пространства имен - PullRequest
4 голосов
/ 10 января 2011

Я вижу, что Qt помещает класс в интерфейс Ui следующим образом:

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    ...

Является ли этот метод тем же, что и весь класс внутри пространства имен?Это, конечно, выглядит чище.

Ответы [ 3 ]

9 голосов
/ 10 января 2011

Нет, в вашем примере Ui::MainWindow - это класс, отличный от класса MainWindow, определенного в глобальном пространстве имен.

Вот:

namespace Ui {
    class MainWindow;
}

class MainWindow
{

};

int main()
{
    Ui::MainWindow mw; // fails due to incomplete type
}

Этот код не компилируется, поскольку Ui::MainWindow является неполным типом.

Скорее всего, код Qt просто использовал предварительное объявление.Вы можете заранее объявить класс в пространстве имен, но вы все равно должны фактически реализовать класс в том же пространстве имен, иначе это не тот же класс.

1 голос
/ 10 января 2011

Два класса разные.Вы говорите не о Qt, а о результатах использования Designer для создания объектов пользовательского интерфейса.Qt делает это правильно, потому что они пытаются отделить сгенерированный код от всего, что вы можете добавить в качестве логики, например, от функций передачи сигналов и т. Д. В противном случае они должны были бы выполнять одну из трех вещей:

1) Попытайтесь объяснить разницу между тем, что дизайнер должен изменить, и тем, чего пользователь не хочет, чтобы ... разрешать конфликты каким-то таинственным образом, который они должны были бы придумать произвольно.

2) Просто переопределите все, что пользователь изменил.

3) Не изменяйте файл, если пользователь не удалил его или что-то еще.

Первый - это большая работа, и неважно, чторазработчики выбрали, кто-то, где-то будет неудобно.Вторая альтернатива, конечно, расстроит людей, потому что весь код слота, который они пишут, будет разрушаться при каждом изменении пользовательского интерфейса, что будет ОЧЕНЬ неудобно почти все время.Третий, конечно, не был бы удобен по ряду причин.

Так что они делают, это отделяют часть объекта пользовательского интерфейса, созданного Проектировщиком, и часть, написанную разработчиком / пользователем.Это позволяет им просто уничтожать изменения в определенных четко определенных областях, в то же время позволяя разработчику добавлять поведение, которое им необходимо, без необходимости добавлять его.

Это не то, что вы обычно делаете в обычном проектировании программ.Это сделано таким образом, чтобы решить довольно специфическую проблему, связанную с автоматически генерируемым кодом.Это довольно продуманный подход ИМНШО.

0 голосов
/ 10 января 2011

Как правило, uic делает заголовки, которые выглядят следующим образом:

      class Ui_MainWindow
      {
         // auto-generated stuff
      };

      namespace Ui {
            class MainWindow: public Ui_MainWindow {};
      }

Это позволяет вам использовать MainWindow в качестве имени вашего класса и при этом вызывать автоматически сгенерированный класс пользовательского интерфейса MainWindow,Обратите внимание, что Ui::MainWindow - это полное определение класса, а не предварительное объявление.

...