Learning Qt - Создание приложения QApplication - PullRequest
4 голосов
/ 04 февраля 2011

Я переучиваю c ++ (у меня 10-летний опыт работы с Java), и я также изучаю Qt в процессе ...

Я привык создавать объекты (в Java) с помощью:

MyObject o = new MyObject();

Но при создании QApplication в c ++ примеры просто показывают:

QApplication app(argc, argv);
app.setOrganizationName("My Company");
app.setApplicationName("The App");

Так внезапно, у меня есть ссылка на "приложение" и нет очевидного (для меня) назначенияк приложению ...

Является ли этот шаблон элементом C ++ или специфичным для Qt?Как называется этот шаблон?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

Не совсем вопрос Qt, но

//You have an assignment to app  
QApplication app(argc, argv);
// is just the same as
QApplication *app = new QApplication(argc, argv);

В C ++ вы можете создавать объекты локально (в стеке) или с новыми (в куче).Его локальное выделение здесь имеет больше смысла, когда объект приложения имеет определенное время жизни (длина основного), не будет удален и воссоздан, а существует только один.

Одна раздражающая особенность C ++ (из-за его наследства c) заключается в том, что доступ к частям результирующего объекта отличается.Если создано непосредственно, вы используете "."app.name(), но при выделении с новым вам необходимо использовать обозначение указателя 'c' app->name()

ps.Существует несколько определенных функций памяти Qt .Qt делает много управления памятью для вас, например.копирование при записи, автоматическое удаление.В Qt вам редко приходится вызывать delete для объекта - для эксперта C ++ это иногда раздражает, но в Java это должно выглядеть более естественно.

5 голосов
/ 04 февраля 2011

Переменная app создается в стеке в строке QApplication app(argc, argv);, она вызывает конструктор QApplication с аргументами argc и argv, который создает QApplication объект с именем app в этом случае.

Это не особенность, характерная для Qt.Таким же образом вы можете выделить любой не виртуальный класс с помощью конструктора.Кроме того, он работает с примитивами, поэтому вы можете сделать, например, следующее:

int val(1); // Equivalent to: int val = 1;

, что создаст целочисленную переменную с именем val со значением 1.

Вы можете разместить объект QApplication в куче.используя new и используйте его следующим образом:

QApplication* app = new QApplication(argc, argv); // Heap allocation
app->setOrganizationName("My Company"); // Notice the -> instead of .
app->setApplicationName("The App");

-> - это, по сути, ярлык для разыменования указателя, и использование .

Распределение в стеке обычно предпочтительнее (но не всегда выполнимо), потому что тогда вам не нужно заботиться о времени жизни объекта (с помощью какого-нибудь умного указателя или необработанного delete), выделение стека также обычно дешевле, чем выделение в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...