0

我有一个相关类的集合,调用它们

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,是吗?

我目前在与每个操作关联的键绑定类型对话框中有按钮,因此该操作可以处理更新它自己的键绑定。

我的问题

如何确保 Keybinding 没有绑定到另一个对象?

可能的解决方案

  1. 将 UpdateKeybind 本身移动到 Manager 类,然后让 Manager 查询所有设置。
  2. 在 Action/Setting/Keybind 中有一个父指针,以便 Action 可以查询管理器以获取更新的键绑定。
  3. 让动作查询其他动作(据我所知,在概念上不是很好)。

我需要你的东西

  1. 就可维护性、速度、易于理解和 OOP 的适用性而言,最严格的方法是实现检查是否已经找到 Keybind,无论是在我建议的解决方案中还是完全其他的方法。我已经尝试过 1 号——它有效,但我觉得它可能会更好,你挖吗?我在 StackOverflow 上找不到类似的问题,但如果你找到了,我很乐意看到它们!

  2. 任何其他专业提示,需要改进的东西都是有帮助的。

4

2 回答 2

1

由于您在键绑定和操作之间具有精确的 1:1 关系,因此您可以从键绑定对象池开始,并在配置操作时从池中提取。因此,在提供可用密钥进行配置时,任何已绑定的密钥都不会在可用池中。

于 2013-05-09T23:52:24.727 回答
1

就像@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;
}
于 2013-05-10T15:22:14.673 回答