QList::contains с QSharedPointer

Итак, у меня есть класс, в котором есть член данных id, и я использую его в QList<QSharedPointer<MyClass>>, и я не уверен, как проверить, существует ли существующий id в этом QList. Как мне это сделать, поскольку QList::contains потребует QSharedPointer<MyClass>&, а не MyClass*

Должен ли я просто использовать QHash, который использует идентификатор в качестве ключа?


person SuperWig    schedule 16.10.2015    source источник
comment
Какой контейнер использовать - решать вам. Чтобы выбрать, какой контейнер использовать, вы должны знать о сложности алгоритма для каждой операции, которую предоставляет контейнер.   -  person Dmitry Sazonov    schedule 16.10.2015
comment
Если ваше программное обеспечение работает в случае, когда вы получаете необработанный MyClass*, а в другой ситуации он удерживается QSharedPointer, то определенно у вас что-то не так с вашим дизайном. Вся идея QSharedPointer заключается в том, чтобы всегда передавать объект как QSharedPointer. В противном случае может случиться так, что у вас есть неверный указатель в вашем коде.   -  person Kamil Klimek    schedule 16.10.2015
comment
@KamilKlimek Извините, я имел в виду, что если бы я не использовал QSharedPointer, я бы просто написал перегрузку оператора, которая затем должна работать с contains   -  person SuperWig    schedule 16.10.2015
comment
Вы не можете переопределить оператор == для типа poitner   -  person Kamil Klimek    schedule 16.10.2015


Ответы (1)


Алгоритм QList::contains основан на == operator. Как указано в документации Qt, == operator из QSharedPointer возвращает true, если значения двух управляемых необработанных указателей имеют одинаковое значение.

Кроме того, если бы вы использовали необработанные указатели в QList, это не сработало бы, потому что вы не можете перезаписать == operator необработанного указателя (у вас есть указатели на MyObject в списке, а не объекты, поэтому перегруженный == из MyObject не будет вызываться).

Единственное решение — вручную перебрать список и проверить равенство с помощью цикла for.

person Ilie NEACSU    schedule 16.10.2015
comment
По какой-то причине я предположил, что он вызовет правильный ==, если он содержит MyClass*. Хотя я подумал, что просто создам свой собственный чек с помощью std::find_if, если это так. Спасибо за Ваш ответ. - person SuperWig; 16.10.2015