Russian Qt Forum

Программирование => С/C++ => Тема начата: blood_shadow от Февраль 10, 2011, 21:06



Название: Операторная ф-ция
Отправлено: 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,
почему так происходит? и как исправить данное положение


Название: Re: Операторная ф-ция
Отправлено: Fat-Zer от Февраль 11, 2011, 02:50
minimumSize() возвращает константу  оператор< должен принимать константу(а ещё лачше константную ссылку), а ещё его хорошо было бы сделать инлайновым и не надо увлекаьбся перегрузкой операторов там, где это не нужно и перегружать их !не! очевидным способом.


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

Вопрос состоит в том почему не работает конструкция?:
Код
C++ (Qt)
dialWindowSize < insertDialog->minimumSize();
 


Название: Re: Операторная ф-ция
Отправлено: shirushizo от Февраль 11, 2011, 19:15
Так напиши
Код:
bool operator <(const QSize &currentSize, const QSize& minSize)
{
    if (currentSize.width() < minSize.width())
        return true;
 
    return false;
}


Название: Re: Операторная ф-ция
Отправлено: Fat-Zer от Февраль 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()


Название: Re: Операторная ф-ция
Отправлено: brankovic от Февраль 11, 2011, 23:28
Вообще-то как вы написали всё должно работать, передача по ссылке тут не при чём. Вы точно не перепутали оператор '<' с оператором '>' ? (т.е. в самом коде точно использовался одинаковый значёк?)


Название: Re: Операторная ф-ция
Отправлено: Пантер от Февраль 11, 2011, 23:50
Слово inline не играет никакой роли.


Название: Re: Операторная ф-ция
Отправлено: brankovic от Февраль 12, 2011, 00:21
Слово inline не играет никакой роли.

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


Название: Re: Операторная ф-ция
Отправлено: Пантер от Февраль 12, 2011, 00:28
brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.


Название: Re: Операторная ф-ция
Отправлено: brankovic от Февраль 12, 2011, 00:47
brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.

Технически, с точки зрения стандарта, он ошибается. Но я помню его рассуждение. Там доказывается, что inline бессмысленнен в своём первичном значении (т.е. как модификатор возможности инлайнить функцию). Тут он по-своему прав.


Название: Re: Операторная ф-ция
Отправлено: Waryable от Февраль 12, 2011, 07:45
brankovic, ссылаюсь на Саттера. У него доказывается, что auto, register и inline не имеют смысла.
Интересно, а где можно почитать?


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 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, если размер коректный


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 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?


Название: Re: Операторная ф-ция
Отправлено: BRE от Февраль 12, 2011, 14:55
причем компилятор говорит что просто не может найти перегруженный оператор для QSize?
Потому что компилятор не имеет права вызывать такой оператор сравнения для константных данных.


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 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;
}
 
такое не работает


Название: Re: Операторная ф-ция
Отправлено: BRE от Февраль 12, 2011, 15:09
А что с чем этот оператор сравнивает?


Название: Re: Операторная ф-ция
Отправлено: Igors от Февраль 12, 2011, 15:26
а почему нельзя эти перегруженные ф-ции сделать членами класса(Analysis_of_accidents - класс)?
Можно но надо указать константность этого оператора
Код
C++ (Qt)
bool Analysis_of_accidents::operator <(const QSize& minSize) const
 
Т.е. и первый операнд не может быть изменен


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 12, 2011, 15:43
Можно но надо указать константность этого оператора
Код
C++ (Qt)
bool Analysis_of_accidents::operator <(const QSize& minSize) const
 
Т.е. и первый операнд не может быть изменен
не, всеравно, говорит что не находит оператор


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 12, 2011, 15:46
А что с чем этот оператор сравнивает?
вот
Код
C++ (Qt)
dialWindowSize < insertDialog->minimumSize()
 

dialWindowSize - размер окна, загруженный с файла (QSize)
insertDialog - QDialog, insertDialog->minimumSize() - возвращает QSize
и insertDialog и dialWindowSize члены класса Analysis_of_accidents


Название: Re: Операторная ф-ция
Отправлено: Fat-Zer от Февраль 12, 2011, 17:54
Код
C++ (Qt)
bool Analysis_of_accidents::operator >(const QSize& maxSize)
 
этот оператор сравнивает объект класса Analysis_of_accidents с QSize, а вы пытаетесь ему два QSize'а подсунуть.


Название: Re: Операторная ф-ция
Отправлено: blood_shadow от Февраль 12, 2011, 18:35
этот оператор сравнивает объект класса Analysis_of_accidents с QSize, а вы пытаетесь ему два QSize'а подсунуть.
о.. протупил так протупил... все понял, в данном контексте или глобальная ф-ция или дружественная
кстати, а как операторную ф-цию сделать дружественной по отношению к классу или оставить глобальной?


Название: Re: Операторная ф-ция
Отправлено: BRE от Февраль 12, 2011, 18:46
о.. протупил так протупил... все понял
А мой вопрос тебя на это не натолкнул?  ::)


Название: Re: Операторная ф-ция
Отправлено: Fat-Zer от Февраль 12, 2011, 18:48
дружественной функция должна быть только если ей нужен доступ к закрытым членам класса. в данном случае, если вы не собираетесь править QSize, дружественной вы её сделать не сможите... да и интерфейса класса вам хватило для реализации.


Название: Re: Операторная ф-ция
Отправлено: Пантер от Февраль 14, 2011, 10:46
Waryable, http://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D1%82%D1%82%D0%B5%D1%80,_%D0%93%D0%B5%D1%80%D0%B1 (http://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D1%82%D1%82%D0%B5%D1%80,_%D0%93%D0%B5%D1%80%D0%B1) Там есть названия книг. В сети найти их не проблема.