Здравствуйте, гость ( Вход | Регистрация )
Andrewshkovskii | Дата 23.11.2009, 1:36 |
Мда, спасибо! Что-то я не додумался до этого, глядя на референс QSet'a.. | |
DIMEDROLL | Дата 22.11.2009, 23:20 |
Почему, когда я пытаюсь сделать вот так вот : if (!(ribs.at(k)->items() &= ribs.at(l)->items()).empty()) ribs это QVector <Cluster *>; то получаю error: passing 'const QSet<int>' as 'this' argument of 'QSet<T>& QSet<T>::operator&=(const QSet<T>&) [with T = int]' discards qualifiers Что вообще обозначает данная ошибка? Ошибка означает, что ты пытаешься изменить константный обьект. Когда ты пишешь
то получаешь:
и у этого вызываешь оператор &=, который изменяет обьект. Используй оператор & и будет работать все как надобно:
|
|
Andrewshkovskii | Дата 22.11.2009, 14:29 |
Контекст.. Смотри, в любом случае будет присваение левому нового значения от операции &=, т.к для QSet, операция пересечения определена 2 методами : 1. Цитата QSet<T> & QSet::intersect ( const QSet<T> & other ) Removes all items from this set that are not contained in the other set. A reference to this set is returned. See also operator&=(), unite(), and subtract(). 2. Цитата QSet<T> & QSet::operator&= ( const QSet<T> & other ) Same as intersect(other). See also operator&(), operator|=(), and operator-=(). И, насколько я понимаю, нету возможности проверить, есть ли пересечения у 2х множест не изменив одно из них. |
|
Litkevich Yuriy | Дата 22.11.2009, 14:22 |
Видимо Ты немного не понял контекст да причём здесь контекст?У операторов типа += совершенно определённый смысл. A += B тоже, что и A = A + B Аналогично: A &= B тоже, что и A = A & B И что ты сделал: if (! (A = A & B )) , т.е. ты делаешь явное присваниавание и при этом говоришь, что тебе оно не нужно. Как тебя понимать? |
|
Andrewshkovskii | Дата 22.11.2009, 14:13 |
Видимо Ты немного не понял контекст, items() возвращает QSet<int>, в данном случае, это и будет пересечение одного множества на другое(левого с правым) и возвращение ссылки на измененное левое множество(вроде так). А оператор &= ,насколько я помню, для стандартных типов выполняет либо присваение ссылки, либо адреса левой переменной от правой. |
|
Litkevich Yuriy | Дата 22.11.2009, 14:10 |
Пересечение множеств НЕТ! (т.к. я не указывал, что аргументами являются множества)Посмтри, где-нибудь про такие операторы в Си/Си++: += -+ *= /= &= |= Узнай что они означают. П.С. "пересечение множеств" это частный смысл какой-либо математической операции. |
|
Andrewshkovskii | Дата 22.11.2009, 14:05 |
Пересечение множеств, только вот одно но, он всераво изменяет левый объект, вот так вот : Цитата QSet<T> & QSet::operator&= ( const QSet<T> & other ) Same as intersect(other). See also operator&(), operator|=(), and operator-=(). Цитата QSet<T> & QSet::intersect ( const QSet<T> & other ) Removes all items from this set that are not contained in the other set. A reference to this set is returned. See also operator&=(), unite(), and subtract(). |
|
Litkevich Yuriy | Дата 22.11.2009, 13:57 |
if (!(ribs.at(k)->items() &= ribs.at(l)->items()).empty()) запиши проще:
что делает оператор &=? Это оператор сравнения? |
|
Andrewshkovskii | Дата 22.11.2009, 11:36 |
Я так понимаю, что для того, что бы можно было хранить свои объекты в сетах, необходимо что бы у объекта были определены : читай по-русски, там понятнее.Там же написано, как QWidget использовать, хотя он и не предоставляет конструктор копирования а вот насчет хэша?..это исходник QHash дописывать, что ли, придется? смотри описание класса QHash, там есть пример собственного класса Employee и соответствующей функции qHashИспользование указателей мне не поможет в данном случае, а вот насчет примера в QHash спасибо, что-то не заметил. А вот что насчет 2го вопроса про QSet и операции над множествами? ========= Написал всё что нужно для сравнения в хэще, только одна проблема: мне надо сравнить 2 поля класса, и оба поля QSet<int>, а хэш поддерживает только простые типы данных.как же быть в этом случае, во что преобразовать этот QSet? Может попробовать брать от каждого элемента Set'a хэш, ксорить их, и возврашать хэш? |
|
Litkevich Yuriy | Дата 22.11.2009, 3:14 |
Я так понимаю, что для того, что бы можно было хранить свои объекты в сетах, необходимо что бы у объекта были определены : читай по-русски, там понятнее.Там же написано, как QWidget использовать, хотя он и не предоставляет конструктор копирования а вот насчет хэша?..это исходник QHash дописывать, что ли, придется? смотри описание класса QHash, там есть пример собственного класса Employee и соответствующей функции qHash |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 29.3.2024, 16:53 |