![]() |
|
|
![]()
|
|
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Здравствуйте. Разбираю пример из книги по Qt. Пример по использованию макроса QPROPERTY. Вот он
Мне не очень понятна вот эта строчка
инициализация объекта базового класса QObject делается объектом этого же класса, который инициализирован в конструкторе MyClass(), Но ведь конструктор MyClass вызывается после конструктора QObject, как так? |
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Это уже к создателям C++. Как мне кажется (рыться в стандарте не хочеться) происходит всё по следующей схеме: * ты вызываешь конструктор класса MyClass и передаешь в него указатель * вызываются базовые конструкторы * конструктор MyClass продолжает своё выполнение и инициализацию членов |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
SABROG, ну понятно, т.е вызов конструктора должен быть таким?
|
|||
|
||||
| ecspertiza |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Тут на самом деле ничего сложного, эта конструкция заменит примерно следующую
Примет параметр proj который ты передашь при создании класса, и скажет твоему классу на чём его создавать >> QObject(proj) и у тебя есть переменная bool m_bReadOnly он её срвзу при создании в false поставит Это сообщение отредактировал(а) ecspertiza - 11.6.2009, 11:45 |
||||
|
|||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| ecspertiza |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Ну а вызов не обязательно должен быть таким
Ты сможешь и просто так создать
|
||||
|
|||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
т.е получается если Я в конструктор MyClass гичего не передаю, то объект Object все-равно создасться в конструкторе, о соответственно после выхода из конструктора этот объект умрет. иак что-ли? Это сообщение отредактировал(а) yngwie19 - 11.6.2009, 13:33 |
|||
|
||||
| korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 1 Всего: 14 |
yngwie19, проинициализируется та часть MyClass, которая заимствована у QObject путем наследования. Это сообщение отредактировал(а) korbian - 11.6.2009, 14:50 -------------------- korbian © |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
| korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 1 Всего: 14 |
yngwie19, на самом деле позаимствовано все, а доступно то, что разрешает используемый спецификатор доступа.
Почитайте Наследование и Права доступа при наследовании и заодно уж про Порядок инициализации в конструкторах -------------------- korbian © |
|||
|
||||
| JekaZZ |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 6.10.2005 Репутация: нет Всего: 3 |
То ли я чего-то не понял, то ли вы куда-то не туда полезли.
Выражение в конструкторе
означает не инициализацию базового класса обьектом prog, а передача указателя prog как parent (в QT это значит владелец) конструируемого объекта. Объект proj не создается в конструкторе MyClass, он передается в него.
Если его не передать, то компилятор автоматически передаст NULL:
|
||||||
|
|||||||
| solan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 23.5.2009 Репутация: нет Всего: нет |
И еще уточню: В данном случает вызов конструктора QObject(proj) не создает новый объект а инициализирует аттрибуты создаваемого объекта MyClass, которые наследуются у QObject (в принципе это все уже писали-) ). Далее вызывается конструктор аттрибута m_bReadOnly, специфичным для MyClass, с параметром, которым и инициализируется этот аттрибут. (С++ полностью объектный язык вопреки многим мнениям (конечно имхо-) ), и как класс здесь можно рассматривать абсолютно любой тип.) В целом, как писалось выше, конструкторы базовых типов, как и аттрибутов, можно не вызывать, и тогда они будут вызваны с параметрами по умолчанию неявно. Это правила ООП. |
|||
|
||||
| yngwie19 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
Почему не работает этот код:
ошибки:
|
||||
|
|||||
| SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Попробуй так:
А тут "WRITE" пишется без 'H'. |
|||
|
||||
| yngwie19 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 15.6.2008 Где: Новгород Репутация: нет Всего: нет |
||||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |