Шаблон команды Qt QHash/QMap

Недавно я реализовал шаблон проектирования команд на Java с использованием:

private HashMap<Component, CommandInterface> commands;

Где Component — это любой компонент Java (JButton, JMenuItem,...), а CommandInterface — это интерфейс для моих классов команд.

Итак, мой вопрос: как я могу сделать это с помощью C++/Qt?

Я уже использовал QMap и QHash, но им обоим нужен перегруженный оператор (operator< или operator==) для их Key-значений.

Единственный возможный способ получить из QObject и перегрузить operator<?

Заранее спасибо.


person chrizbee    schedule 17.11.2017    source источник


Ответы (1)


Одно очень важное различие между Java и C++ состоит в том, что C++ делает различие между указателем объекта (ссылкой в ​​Java) QObject* o; и значением объекта QObject o;.

При этом Qt настоятельно рекомендует создавать QObject в куче (используя new). Таким образом, вы получаете указатели QObject QObject*. Тогда ваша хэш-карта будет работать, потому что сравнение указателей похоже на сравнение целых чисел.

QHash<QObject*, CommandInterface*> commands;

Не забывайте управлять временем жизни ваших объектов, хотя у вас нет сборщика мусора, как в Java. Вы можете использовать владение деревом Qt для удобства, в зависимости от ваших потребностей: http://doc.qt.io/qt-5/objecttrees.html

person ymoreau    schedule 17.11.2017
comment
Не знал, вы можете использовать указатель как Key для QHash из-за функции qHash(), которую необходимо предоставить. Спасибо, я попробую! - person chrizbee; 17.11.2017
comment
@ChristianB, как я уже сказал, указатель - это просто целочисленное значение (адрес памяти), поэтому его можно использовать как таковое, а Qt предоставляет qHash() для большинства распространенных типов C++, а также классов данных и контейнеров Qt (QString, QVector и т. д.). - person ymoreau; 17.11.2017