crossplatform.ru

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


  Ответ в Свои объекты в QSet
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Andrewshkovskii Дата 23.11.2009, 1:36
  Мда, спасибо! Что-то я не додумался до этого, глядя на референс QSet'a..
DIMEDROLL Дата 22.11.2009, 23:20
 
Цитата(Andrewshkovskii @ 22.11.2009, 1:01) *
Почему, когда я пытаюсь сделать вот так вот :

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



Что вообще обозначает данная ошибка?


Ошибка означает, что ты пытаешься изменить константный обьект. Когда ты пишешь
ribs.at(k)->items()

то получаешь:
const QSet<int>

и у этого вызываешь оператор &=, который изменяет обьект. Используй оператор & и будет работать все как надобно:
if (!(ribs.at(k)->items() & ribs.at(l)->items()).empty())

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
 
Цитата(Andrewshkovskii @ 22.11.2009, 17:13) *
Видимо Ты немного не понял контекст
да причём здесь контекст?
У операторов типа +=
совершенно определённый смысл.
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, 17:05) *
Пересечение множеств
НЕТ! (т.к. я не указывал, что аргументами являются множества)
Посмтри, где-нибудь про такие операторы в Си/Си++:
+=
-+
*=
/=
&=
|=
Узнай что они означают.

П.С. "пересечение множеств" это частный смысл какой-либо математической операции.
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
 
Цитата(Andrewshkovskii @ 22.11.2009, 5:01) *
if (!(ribs.at(k)->items() &= ribs.at(l)->items()).empty())
запиши проще:
if (!(A &= B))

что делает оператор &=?
Это оператор сравнения?
Andrewshkovskii Дата 22.11.2009, 11:36
 
Цитата(Litkevich Yuriy @ 22.11.2009, 3:14) *
Цитата(Andrewshkovskii @ 22.11.2009, 5:01) *
Я так понимаю, что для того, что бы можно было хранить свои объекты в сетах, необходимо что бы у объекта были определены :
читай по-русски, там понятнее.
Там же написано, как QWidget использовать, хотя он и не предоставляет конструктор копирования

Цитата(Andrewshkovskii @ 22.11.2009, 5:01) *
а вот насчет хэша?..это исходник QHash дописывать, что ли, придется?
смотри описание класса QHash, там есть пример собственного класса Employee и соответствующей функции qHash


Использование указателей мне не поможет в данном случае, а вот насчет примера в QHash спасибо, что-то не заметил.
А вот что насчет 2го вопроса про QSet и операции над множествами?
=========
Написал всё что нужно для сравнения в хэще, только одна проблема:
мне надо сравнить 2 поля класса, и оба поля QSet<int>, а хэш поддерживает только простые типы данных.как же быть в этом случае, во что преобразовать этот QSet? Может попробовать брать от каждого элемента Set'a хэш, ксорить их, и возврашать хэш?
Litkevich Yuriy Дата 22.11.2009, 3:14
 
Цитата(Andrewshkovskii @ 22.11.2009, 5:01) *
Я так понимаю, что для того, что бы можно было хранить свои объекты в сетах, необходимо что бы у объекта были определены :
читай по-русски, там понятнее.
Там же написано, как QWidget использовать, хотя он и не предоставляет конструктор копирования

Цитата(Andrewshkovskii @ 22.11.2009, 5:01) *
а вот насчет хэша?..это исходник QHash дописывать, что ли, придется?
смотри описание класса QHash, там есть пример собственного класса Employee и соответствующей функции qHash
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 0:28