| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Пара вопросов по Q_PROPERTY |
| Автор: yngwie19 10.6.2009, 23:37 | ||||
Здравствуйте. Разбираю пример из книги по Qt. Пример по использованию макроса QPROPERTY. Вот он
Мне не очень понятна вот эта строчка
инициализация объекта базового класса QObject делается объектом этого же класса, который инициализирован в конструкторе MyClass(), Но ведь конструктор MyClass вызывается после конструктора QObject, как так? |
| Автор: SABROG 11.6.2009, 11:34 |
Это уже к создателям C++. Как мне кажется (рыться в стандарте не хочеться) происходит всё по следующей схеме: * ты вызываешь конструктор класса MyClass и передаешь в него указатель * вызываются базовые конструкторы * конструктор MyClass продолжает своё выполнение и инициализацию членов |
| Автор: yngwie19 11.6.2009, 11:44 | ||
SABROG, ну понятно, т.е вызов конструктора должен быть таким?
|
| Автор: ecspertiza 11.6.2009, 11:45 | ||||
Тут на самом деле ничего сложного, эта конструкция заменит примерно следующую
Примет параметр proj который ты передашь при создании класса, и скажет твоему классу на чём его создавать >> QObject(proj) и у тебя есть переменная bool m_bReadOnly он её срвзу при создании в false поставит |
| Автор: yngwie19 11.6.2009, 13:02 |
немного не понял фразу. Передав в конструктор MyClass адрес объекта proj, мы им инициализируем конструктор базового класса. Вы это имеете в виду? |
| Автор: ecspertiza 11.6.2009, 13:24 | ||||
| Ну а вызов не обязательно должен быть таким
Ты сможешь и просто так создать
|
| Автор: yngwie19 11.6.2009, 13:31 |
т.е получается если Я в конструктор MyClass гичего не передаю, то объект Object все-равно создасться в конструкторе, о соответственно после выхода из конструктора этот объект умрет. иак что-ли? |
| Автор: yngwie19 11.6.2009, 15:00 | ||
А можно поподробнее что у меня позаимствовано от класса QObject? |
| Автор: korbian 11.6.2009, 15:14 |
| yngwie19, на самом деле позаимствовано все, а доступно то, что разрешает используемый спецификатор доступа. Почитайте http://ru.wikipedia.org/wiki/Наследование_(программирование) и http://alenacpp.blogspot.com/2006/03/blog-post_11.html и заодно уж про http://habrahabr.ru/blogs/cpp/58818/ |
| Автор: JekaZZ 11.6.2009, 18:26 | ||||||
| То ли я чего-то не понял, то ли вы куда-то не туда полезли. Выражение в конструкторе
означает не инициализацию базового класса обьектом prog, а передача указателя prog как parent (в QT это значит владелец) конструируемого объекта. Объект proj не создается в конструкторе MyClass, он передается в него.
Если его не передать, то компилятор автоматически передаст NULL:
|
| Автор: solan 11.6.2009, 23:48 | ||
И еще уточню: В данном случает вызов конструктора QObject(proj) не создает новый объект а инициализирует аттрибуты создаваемого объекта MyClass, которые наследуются у QObject (в принципе это все уже писали-) ). Далее вызывается конструктор аттрибута m_bReadOnly, специфичным для MyClass, с параметром, которым и инициализируется этот аттрибут. (С++ полностью объектный язык вопреки многим мнениям (конечно имхо-) ), и как класс здесь можно рассматривать абсолютно любой тип.) В целом, как писалось выше, конструкторы базовых типов, как и аттрибутов, можно не вызывать, и тогда они будут вызваны с параметрами по умолчанию неявно. Это правила ООП. |
| Автор: yngwie19 12.6.2009, 10:03 | ||||
Почему не работает этот код:
ошибки:
|
| Автор: SABROG 12.6.2009, 10:05 | ||
Попробуй так:
А тут "WRITE" пишется без 'H'. |
| Автор: yngwie19 12.6.2009, 11:28 |
| SABROG, да так работает. В книге вообще такой пример: http://ipicture.ru/Gallery/Viewfull/19814143.html Объясните пожалуйста, почему тут сказано что из Программы мы можем изменять и узнавать значения поля через объект proj, который является объектом класса MeClass. И почему тут при вызове setProperty не нужно приводить к типу QVariant знчение true? |
| Автор: SABROG 12.6.2009, 11:36 | ||||
Потому, что это динамическое свойство QObject'a, который унаследован классом MeClass. По сути обычный внутренний список/массив типа QVariantMap/QVariantHash.
На компиляторе gcc/MinGW использовать qVariantFromValue не требуется. Скорее всего проблема именно в компиляторе которым ты пользуешься (MSVC?). P.S.: книги это хорошо, но в них часто забывают упомянуть некоторые тонкости, которые есть в документации, а еще книги устаревают. Поэтому лучше изучать Qt параллельно читая книги и документацию. Мне хватает последнего и примеров. |
| Автор: Любитель 12.6.2009, 12:02 |
| Модератор: Пожалуйста, один топик - один вопрос. |
| Автор: yngwie19 12.6.2009, 12:08 | ||||
| Любитель, простите пожалуйста. Я специально в теме указал что несколько вопросов. Мне хочется сразу разобраться с этими свойствами. Добавлено через 1 минуту и 33 секунды SABROG, ой proj является объектом класса QObject не MyClass Добавлено через 5 минут и 19 секунд мне все же не понятно, почему когда мы пишем:
то у нас вызывается
|
| Автор: andrew_121 12.6.2009, 13:32 |
| yngwie19, http://forum.vingrad.ru/index.php?showtopic=262908&view=findpost&p=1893904 |