Название: Операторная ф-ция Отправлено: blood_shadow от Февраль 10, 2011, 21:06 Добрый вечер
в файле реализации я объявил глобальные ф-циию Код
потом внутри ф-ции данного класса callMainDialog() я делаю так: Код
запись dialWindowSize < size; работает, но если сделать вот так: Код то компилятор говорит что не знает узнает такой перегруженный оператор, хотя minimumSize() возращает объект QSize, почему так происходит? и как исправить данное положение Название: Re: Операторная ф-ция Отправлено: Fat-Zer от Февраль 11, 2011, 02:50 minimumSize() возвращает константу оператор< должен принимать константу(а ещё лачше константную ссылку), а ещё его хорошо было бы сделать инлайновым и не надо увлекаьбся перегрузкой операторов там, где это не нужно и перегружать их !не! очевидным способом.
Название: Re: Операторная ф-ция Отправлено: blood_shadow от Февраль 11, 2011, 09:14 minimumSize() возвращает константу оператор< должен принимать константу(а ещё лачше константную ссылку), а ещё его хорошо было бы сделать инлайновым и не надо увлекаьбся перегрузкой операторов там, где это не нужно и перегружать их !не! очевидным способом. так я и сделал перегрузку чтобы операция сравнения, а потом изменения размера окна была очевидной, допустим для такого кода:Код
Вопрос состоит в том почему не работает конструкция?: Код
Название: Re: Операторная ф-ция Отправлено: shirushizo от Февраль 11, 2011, 19:15 Так напиши
Код: bool operator <(const QSize ¤tSize, const QSize& minSize) Название: Re: Операторная ф-ция Отправлено: Fat-Zer от Февраль 11, 2011, 19:44 так я и сделал перегрузку чтобы операция сравнения, а потом изменения размера окна была очевидной, допустим для такого кода: про перегрузку - должно работать и так... хотя как 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() Код
dialWindowSize - это загруженный размер, а insertDialog - это диалоговое окно, которое ресайзиться к dialWindowSize, если размер коректный Название: Re: Операторная ф-ция Отправлено: blood_shadow от Февраль 12, 2011, 14:36 Вообще-то как вы написали всё должно работать, передача по ссылке тут не при чём. Вы точно не перепутали оператор '<' с оператором '>' ? (т.е. в самом коде точно использовался одинаковый значёк?) ничего не пойму.. это наверно какой-то глюк компилятора, теперь работает конструкция:Код
для кода: Код
народ может мне кто-то объяснит почему: Код: bool operator >(const QSize& currentSize, const QSize& maxSize) Код: bool operator >(QSize& currentSize, QSize& maxSize) Название: Re: Операторная ф-ция Отправлено: BRE от Февраль 12, 2011, 14:55 причем компилятор говорит что просто не может найти перегруженный оператор для QSize? Потому что компилятор не имеет права вызывать такой оператор сравнения для константных данных.Название: Re: Операторная ф-ция Отправлено: blood_shadow от Февраль 12, 2011, 15:02 Потому что компилятор не имеет права вызывать такой оператор сравнения для константных данных. а, понятно, это все из-за запрета модификации временного объекта.. просто как-то не очевидные объяснение компилятораеще вопрос: а почему нельзя эти перегруженные ф-ции сделать членами класса(Analysis_of_accidents - класс)? Код такое не работает Название: Re: Операторная ф-ция Отправлено: BRE от Февраль 12, 2011, 15:09 А что с чем этот оператор сравнивает?
Название: Re: Операторная ф-ция Отправлено: Igors от Февраль 12, 2011, 15:26 а почему нельзя эти перегруженные ф-ции сделать членами класса(Analysis_of_accidents - класс)? Можно но надо указать константность этого оператора Код Т.е. и первый операнд не может быть изменен Название: Re: Операторная ф-ция Отправлено: blood_shadow от Февраль 12, 2011, 15:43 Можно но надо указать константность этого оператора не, всеравно, говорит что не находит операторКод Т.е. и первый операнд не может быть изменен Название: Re: Операторная ф-ция Отправлено: blood_shadow от Февраль 12, 2011, 15:46 А что с чем этот оператор сравнивает? вот Код
dialWindowSize - размер окна, загруженный с файла (QSize) insertDialog - QDialog, insertDialog->minimumSize() - возвращает QSize и insertDialog и dialWindowSize члены класса Analysis_of_accidents Название: Re: Операторная ф-ция Отправлено: Fat-Zer от Февраль 12, 2011, 17:54 Код
Название: 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) Там есть названия книг. В сети найти их не проблема.
|