ООП: правильный способ проверки других экземпляров переменных объекта

У меня есть коллекция связанных классов, назовите их

class Manager {

private:
std::vector<Setting> m_settings;
}

class Setting {
private:
std::vector<Action> m_actions;
}

class Action {
private:
Keybind m_keybind;
}

class Keybind {
public:
UpdateKeybind;
private:
TYPE keybind;
}

Как видно из псевдо-C ++ кода, в настройках есть действия, а действия имеют только одну привязку ключа. Теперь, как пользователь моего приложения, вы хотите обновить Keybind потенциально, да?

В настоящее время у меня есть кнопки в диалоге типа привязки клавиш, связанные с каждым действием, поэтому действие может обрабатывать обновление своей собственной привязки клавиш.

Моя проблема:

Как я могу убедиться, что связывание клавиш не связано с другим объектом?

Возможные решения:

  1. Переместите UpdateKeybind себя в класс Manager, а затем Manager запросит все настройки.
  2. Имейте родительский указатель в Action / Setting / Keybind, чтобы Action мог запросить у менеджера обновленную keybind.
  3. Пусть Action запрашивает другие действия (концептуально, насколько я могу судить, не очень).

Что мне нужно от тебя:

  1. Каков наиболее строгий подход с точки зрения удобства сопровождения, скорости, простоты понимания и целесообразности ООП для реализации проверки, если Keybind уже найден, вне зависимости от моих предложенных решений или чего-то еще полностью. Я уже попробовал номер 1 — он работает, но я чувствую, что это может быть лучше, ты копаешь?
    Мне не удалось найти похожие вопросы в StackOverflow, но если вы это сделаете, мне бы очень хотелось их увидеть!

  2. Любые другие профессиональные советы, вещи для улучшения полезны.

0

Решение

Как говорит @Amardeep, вы можете попробовать создать класс, управляющий отображением между действиями и сочетаниями клавиш. Ниже приведен пример. Он автоматически удалит привязку к действию, если для этой привязки будет новая привязка.

class Manager {
private:
std::vector<Setting*> m_settings;
KeybindPool *m_keybindPool;
};

class Setting {
private:
std::vector<Action*> m_actions;
};

class Action {
public:
void Bind(Keybind* keybind) {
m_manager->m_keybindPool->Update(this, keybind)
}
Keybind* getKeybind() const {
return m_manager->m_keybindPool->getKeybind(this);
}
private:
Manager *m_manager;
};

class KeybindPool {
public:
void Update(Action* action, Keybind* keybind) {
if (m_keybindActionMap.find(keybind) != m_keybindActionMap.end()) {
m_actionKeybindMap.erase(action);
}
m_keybindActionMap[keybind] = action;
m_actionKeybindMap[action] = keybind;
}
Keybind* getKeybind(Action* action) {
return m_actionKeybindMap[action];
}
private:
map<Keybind*, Action*> m_keybindActionMap;
map<Action*, Keybind*> m_actionKeybindMap;
};

class Keybind {
private:
TYPE keybind;
}
1

Другие решения

Поскольку между привязками клавиш и действиями существует ровное соотношение 1: 1, вы можете начать с пула объектов привязки клавиш и использовать его при настройке действий. Таким образом, при предложении доступных ключей для конфигурации любые уже связанные ключи не будут находиться в доступном пуле.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector