Конструктор не существует, но работает..., Объясните, как такое может быть? |
Здравствуйте, гость ( Вход | Регистрация )
Конструктор не существует, но работает..., Объясните, как такое может быть? |
Darvin |
3.12.2007, 8:06
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
Создаю экземпляр картинки и добавляю его в сцену
item = new QGraphicsPixmapItem("FileName.jpg"); scene.addItem(item); Как видно, я использую конструктор вида QGraphicsPixmapItem(const QString& path); и он работает правильно, картинка загружается и добавляется! Однако, в исходниках нахожу вот такое определение класса QGraphicsPixmapItem, в нем нет такого конструктора. В Ассистенте тоже самое.
Объясните, что это за колдунство? |
|
|
Admin |
3.12.2007, 8:42
Сообщение
#2
|
Администратор Группа: Администратор Сообщений: 646 Регистрация: 9.10.2007 Из: crossplatform.ru Пользователь №: 1 Спасибо сказали: 17 раз(а) Репутация: 2 |
Может быть твоя запись:
неявно преобразуется к следующей:
|
|
|
ViGOur |
3.12.2007, 8:59
Сообщение
#3
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
А ты поставь точку останова на item = new QGraphicsPixmapItem("FileName.jpg"); и посмотри в какой конструктор прыгнешь...
|
|
|
Darvin |
3.12.2007, 10:00
Сообщение
#4
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
Может быть твоя запись неявно преобразуется к следующей: Это как? Где то по любому должно быть явное определение. А ты поставь точку останова на item = new QGraphicsPixmapItem("FileName.jpg"); и посмотри в какой конструктор прыгнешь... Пока не смог настроить отладчик под Eclipse. |
|
|
ViGOur |
3.12.2007, 10:11
Сообщение
#5
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Пока не смог настроить отладчик под Eclipse. В том-то все и дело, что у меня под студией это даже не компилиться. Пишу QGraphicsPixmapItem *item = new QGraphicsPixmapItem( "FileName.jpg");, на что мне компилятор говорит: Цитата error C2664: 'QGraphicsPixmapItem::QGraphicsPixmapItem(QGraphicsItem *,QGraphicsScene *)' : cannot convert parameter 1 from 'const char [13]' to 'QGraphicsItem *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Если же явно указать, то все ок, видимо в Eclipse есть неявное преобразование какое или ты сам его делаешь.
|
|
|
Darvin |
3.12.2007, 10:22
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
Пока не смог настроить отладчик под Eclipse. В том-то все и дело, что у меня под студией это даже не компилиться. Пишу QGraphicsPixmapItem *item = new QGraphicsPixmapItem( "FileName.jpg");, на что мне компилятор говорит: Цитата error C2664: 'QGraphicsPixmapItem::QGraphicsPixmapItem(QGraphicsItem *,QGraphicsScene *)' : cannot convert parameter 1 from 'const char [13]' to 'QGraphicsItem *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast Если же явно указать, то все ок, видимо в Eclipse есть неявное преобразование какое или ты сам его делаешь.Если честно, то я делаю не так как написал, а немного иначе. Я упростил код. На самом деле у меня вот так item = MyPixmapItem("file.jpg"); class MyPixmapItem: public QGraphicsPixmapItem { ... } MyPixmapItem::MyPixmapItem(const QString& filename):QGraphicsPixmapItem(filename) { ... } Но ведь это сути не меняет. Вот и не понятно, где в Eclipse это преобразование включается/выключается и как он понимает к чему нужно преобразовывать? |
|
|
ViGOur |
3.12.2007, 10:35
Сообщение
#7
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
То что ты привел, компилится и в дебагере видно, что при попадении в коструктор MyPixmapItem, неявно вызывается конструктор для QPixmap.
|
|
|
Darvin |
3.12.2007, 10:47
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
То что ты привел, компилится и в дебагере видно, что при попадении в коструктор MyPixmapItem, неявно вызывается конструктор для QPixmap. Мда... Спасибо! Вот интересно. Допустим, я лезу в Ассистент и не нахожу нужного конструктора для какого-нибудь класса. Похериваю данный факт и пишу по своему. И оно меня понимает! Не пойму, хорошо это или плохо =))) |
|
|
ViGOur |
3.12.2007, 10:59
Сообщение
#9
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Вот пример неявного преобразования, не знаю насколько это по стандарту, нужно будет почитать:
Для того, чтобы не происходило неявного преобразования нужно пользоваться ключевым словом explicit. Это плохо только в том случае, когда ты не понимаешь, что происходит, как в данном случае, соответственно возможен не желательный результат работы твоей программы, особенно если речь идет о приоритетах неявного преобразования. |
|
|
Darvin |
3.12.2007, 11:10
Сообщение
#10
|
Студент Группа: Новичок Сообщений: 36 Регистрация: 30.11.2007 Пользователь №: 30 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вот еще бы понять, по каким правилам C++ это происходит. Тоесть как и где определены эти правила и приоритеты.
Сообщение отредактировал Darvin - 3.12.2007, 11:14 |
|
|
Текстовая версия | Сейчас: 12.9.2024, 13:22 |