Russian Qt Forum
Ноябрь 24, 2024, 00:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Операторная ф-ция  (Прочитано 10029 раз)
blood_shadow
Гость
« : Февраль 10, 2011, 21:06 »

Добрый вечер

в файле реализации я объявил глобальные ф-циию
Код
C++ (Qt)
bool operator <(QSize currentSize, QSize minSize)
{
   if (currentSize.width() < minSize.width())
       return true;
 
   return false;
}
 

потом внутри ф-ции данного класса callMainDialog() я делаю так:

Код
C++ (Qt)
QSize size;
size = insertDialog->minimumSize();
dialWindowSize < size;
 

запись dialWindowSize < size; работает, но если сделать вот так:
Код
C++ (Qt)
dialWindowSize < insertDialog->minimumSize();
 
то компилятор говорит что не знает узнает такой перегруженный оператор, хотя minimumSize() возращает объект QSize,
почему так происходит? и как исправить данное положение
Записан
Fat-Zer
Гость
« Ответ #1 : Февраль 11, 2011, 02:50 »

minimumSize() возвращает константу  оператор< должен принимать константу(а ещё лачше константную ссылку), а ещё его хорошо было бы сделать инлайновым и не надо увлекаьбся перегрузкой операторов там, где это не нужно и перегружать их !не! очевидным способом.
Записан
blood_shadow
Гость
« Ответ #2 : Февраль 11, 2011, 09:14 »

minimumSize() возвращает константу  оператор< должен принимать константу(а ещё лачше константную ссылку), а ещё его хорошо было бы сделать инлайновым и не надо увлекаьбся перегрузкой операторов там, где это не нужно и перегружать их !не! очевидным способом.
так я и сделал перегрузку чтобы операция сравнения, а потом изменения размера окна была очевидной, допустим для такого кода:
Код
C++ (Qt)
if (dialWindowSize.isEmpty() || (dialWindowSize < insertDialog->minimumSize()))
       dialWindowSize = insertDialog->minimumSize();
insertDialog->resize(dialWindowSize);
 

Вопрос состоит в том почему не работает конструкция?:
Код
C++ (Qt)
dialWindowSize < insertDialog->minimumSize();
 
Записан
shirushizo
Гость
« Ответ #3 : Февраль 11, 2011, 19:15 »

Так напиши
Код:
bool operator <(const QSize &currentSize, const QSize& minSize)
{
    if (currentSize.width() < minSize.width())
        return true;
 
    return false;
}
Записан
Fat-Zer
Гость
« Ответ #4 : Февраль 11, 2011, 19:44 »

так я и сделал перегрузку чтобы операция сравнения, а потом изменения размера окна была очевидной, допустим для такого кода:
Код
C++ (Qt)
if (dialWindowSize.isEmpty() || (dialWindowSize < insertDialog->minimumSize()))
       dialWindowSize = insertDialog->minimumSize();
insertDialog->resize(dialWindowSize);
 

Вопрос состоит в том почему не работает конструкция?:
Код
C++ (Qt)
dialWindowSize < insertDialog->minimumSize();
 
про перегрузку - должно работать и так... хотя как shirushizo ИМХО правильней(можно ещё inline добавить)... можно проект на котором это воспроизводится?
про стилистику: не очевидно, что оператор < проверяет только ширину, так что ИМХО лучше пару раз написать .width()
Записан
brankovic
Гость
« Ответ #5 : Февраль 11, 2011, 23:28 »

Вообще-то как вы написали всё должно работать, передача по ссылке тут не при чём. Вы точно не перепутали оператор '<' с оператором '>' ? (т.е. в самом коде точно использовался одинаковый значёк?)
« Последнее редактирование: Февраль 12, 2011, 00:50 от brankovic » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Февраль 11, 2011, 23:50 »

Слово inline не играет никакой роли.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
brankovic
Гость
« Ответ #7 : Февраль 12, 2011, 00:21 »

Слово inline не играет никакой роли.

Играет некоторую. inline функции могут дублироваться при линковке. В gcc даже есть понятие слабых символов для поддержки такого трюка (__attribute__ weak). Собственно шаблонные функции обладают тем же свойством.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Февраль 12, 2011, 00:28 »

brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
brankovic
Гость
« Ответ #9 : Февраль 12, 2011, 00:47 »

brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.

Технически, с точки зрения стандарта, он ошибается. Но я помню его рассуждение. Там доказывается, что inline бессмысленнен в своём первичном значении (т.е. как модификатор возможности инлайнить функцию). Тут он по-своему прав.
Записан
Waryable
Гость
« Ответ #10 : Февраль 12, 2011, 07:45 »

brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.
Интересно, а где можно почитать?
Записан
blood_shadow
Гость
« Ответ #11 : Февраль 12, 2011, 14:27 »

можно проект на котором это воспроизводится?
про стилистику: не очевидно, что оператор < проверяет только ширину, так что ИМХО лучше пару раз написать .width()
ну вообщем значек < и > проверяют является ли размер диалогового окна больше или меньше минимально возможных(я делаю загрузку размера с файла поэтому хочу на всякий случай перестраховаться)
Код
C++ (Qt)
if (dialWindowSize.isEmpty() || (dialWindowSize < insertDialog->minimumSize())
       || dialWindowSize > insertDialog->maximumSize())
       dialWindowSize = insertDialog->minimumSize();
 
insertDialog->resize(dialWindowSize);
 

dialWindowSize - это загруженный размер, а insertDialog - это диалоговое окно, которое ресайзиться к dialWindowSize, если размер коректный
Записан
blood_shadow
Гость
« Ответ #12 : Февраль 12, 2011, 14:36 »

Вообще-то как вы написали всё должно работать, передача по ссылке тут не при чём. Вы точно не перепутали оператор '<' с оператором '>' ? (т.е. в самом коде точно использовался одинаковый значёк?)
ничего не пойму.. это наверно какой-то глюк компилятора, теперь работает конструкция:
Код
C++ (Qt)
bool operator <(QSize currentSize, QSize minSize)
{
   if (currentSize.width() < minSize.width())
       return true;
 
   else if (currentSize.height() < minSize.height())
       return true;
 
   return false;
}
 
bool operator >(QSize currentSize, QSize maxSize)
{
   if (currentSize.width() > maxSize.width())
       return true;
 
   else if (currentSize.height() > maxSize.height())
       return true;
 
   return false;
}
 

для кода:
Код
C++ (Qt)
if (dialWindowSize.isEmpty() || (dialWindowSize < insertDialog->minimumSize())
       || dialWindowSize > insertDialog->maximumSize())
       dialWindowSize = insertDialog->minimumSize();
 

народ может мне кто-то объяснит почему:
Код:
bool operator >(const QSize& currentSize, const QSize& maxSize)

bool operator >(QSize currentSize, QSize maxSize)
работает, а:
Код:
bool operator >(QSize& currentSize, QSize& maxSize)
не работает, причем компилятор говорит что просто не может найти перегруженный оператор для QSize?
Записан
BRE
Гость
« Ответ #13 : Февраль 12, 2011, 14:55 »

причем компилятор говорит что просто не может найти перегруженный оператор для QSize?
Потому что компилятор не имеет права вызывать такой оператор сравнения для константных данных.
Записан
blood_shadow
Гость
« Ответ #14 : Февраль 12, 2011, 15:02 »

Потому что компилятор не имеет права вызывать такой оператор сравнения для константных данных.
а, понятно, это все из-за запрета модификации временного объекта.. просто как-то не очевидные объяснение компилятора

еще вопрос:
а почему нельзя эти перегруженные ф-ции сделать членами класса(Analysis_of_accidents - класс)?
Код
C++ (Qt)
bool Analysis_of_accidents::operator <(const QSize& minSize)
{
   if (this->width() < minSize.width())
       return true;
 
   else if (this->height() < minSize.height())
       return true;
 
   return false;
}
 
bool Analysis_of_accidents::operator >(const QSize& maxSize)
{
   if (this->width() > maxSize.width())
       return true;
 
   else if (this->height() > maxSize.height())
       return true;
 
   return false;
}
 
такое не работает
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.278 секунд. Запросов: 23.