Шаблон команды Qt QHash/QMap
Недавно я реализовал шаблон проектирования команд в Java с использованием:
private HashMap<Component, CommandInterface> commands;
куда Component
любой компонент Java (JButton
, JMenuItem
,...) а также CommandInterface
интерфейс для моих командных классов
Итак, мой вопрос: как я могу сделать это с C++/Qt?
Я уже использовал QMap
а также QHash
но им обоим нужен перегруженный оператор (operator<
или же operator==
) для них Key
-ценности.
Это единственный возможный способ получить из QObject
и перегрузка operator<
?
Заранее спасибо.
1 ответ
Одно очень важное различие между Java и C++ состоит в том, что C++ делает различие между указателем объекта (ссылка в Java) QObject* o;
и значение объекта QObject o;
При этом Qt настоятельно рекомендует создавать QObject в куче (используя new). Таким образом, вы в конечном итоге с указателями QObject QObject*
, Тогда ваш hashmap будет работать, потому что сравнение указателей похоже на сравнение целых чисел.
QHash<QObject*, CommandInterface*> commands;
Не забывайте управлять временем жизни ваших объектов, хотя у вас нет сборщика мусора, как в Java. Вы можете использовать владение деревом Qt для удобства, в зависимости от ваших потребностей: http://doc.qt.io/qt-5/objecttrees.html