crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Конструктор не существует, но работает..., Объясните, как такое может быть?
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, в нем нет такого конструктора.
В Ассистенте тоже самое.

class Q_GUI_EXPORT QGraphicsPixmapItem : public QGraphicsItem
{
public:
    enum ShapeMode {
        MaskShape,
        BoundingRectShape,
        HeuristicMaskShape
    };

    QGraphicsPixmapItem(QGraphicsItem *parent = 0
#ifndef Q_QDOC
                        // obsolete argument
                        , QGraphicsScene *scene = 0
#endif
        );
    QGraphicsPixmapItem(const QPixmap &pixmap, QGraphicsItem *parent = 0
#ifndef Q_QDOC
                        // obsolete argument
                        , QGraphicsScene *scene = 0
#endif
        );


Объясните, что это за колдунство?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Admin
  опции профиля:
сообщение 3.12.2007, 8:42
Сообщение #2


Администратор
****

Группа: Администратор
Сообщений: 646
Регистрация: 9.10.2007
Из: crossplatform.ru
Пользователь №: 1

Спасибо сказали: 17 раз(а)




Репутация:   2  


Может быть твоя запись:
QGraphicsPixmapItem("FileName.jpg");
неявно преобразуется к следующей:
QGraphicsPixmapItem( QPixmap("FileName.jpg"));
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(Admin @ 3.12.2007, 8:42) *
Может быть твоя запись неявно преобразуется к следующей:

Это как? Где то по любому должно быть явное определение.


Цитата(Admin @ 3.12.2007, 8:42) *
А ты поставь точку останова на item = new QGraphicsPixmapItem("FileName.jpg"); и посмотри в какой конструктор прыгнешь...

Пока не смог настроить отладчик под Eclipse.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.12.2007, 10:11
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Darvin @ 3.12.2007, 10:00) *
Пока не смог настроить отладчик под 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  


Цитата(ViGOur @ 3.12.2007, 10:11) *
Цитата(Darvin @ 3.12.2007, 10:00) *
Пока не смог настроить отладчик под 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  


Цитата(ViGOur @ 3.12.2007, 10:35) *
То что ты привел, компилится и в дебагере видно, что при попадении в коструктор MyPixmapItem, неявно вызывается конструктор для QPixmap.


Мда... Спасибо!

Вот интересно. Допустим, я лезу в Ассистент и не нахожу нужного конструктора для какого-нибудь класса.
Похериваю данный факт и пишу по своему. И оно меня понимает! Не пойму, хорошо это или плохо =)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 3.12.2007, 10:59
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Вот пример неявного преобразования, не знаю насколько это по стандарту, нужно будет почитать:
class B
{
public:
    B( QString sz){}
};

class A
{
public:
    A( B b){}
};

void main()
{
    QString sz;
    A a( sz);
}


Для того, чтобы не происходило неявного преобразования нужно пользоваться ключевым словом explicit. :)

Это плохо только в том случае, когда ты не понимаешь, что происходит, как в данном случае, соответственно возможен не желательный результат работы твоей программы, особенно если речь идет о приоритетах неявного преобразования.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Darvin
  опции профиля:
сообщение 3.12.2007, 11:10
Сообщение #10


Студент
*

Группа: Новичок
Сообщений: 36
Регистрация: 30.11.2007
Пользователь №: 30

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вот еще бы понять, по каким правилам C++ это происходит. Тоесть как и где определены эти правила и приоритеты.

Сообщение отредактировал Darvin - 3.12.2007, 11:14
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 12.9.2024, 13:22