【问题标题】:OOP: Proper way to check other instances of objects' variablesOOP:检查对象变量的其他实例的正确方法
【发布时间】:2013-05-10 23:22:14
【问题描述】:

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

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 的适当性而言,最严格的方法是什么,以实施检查是否已经找到键绑定,无论是在我建议的解决方案之外还是完全其他的方法。我已经尝试过 1 号——它有效,但我觉得它可能会更好,你挖吗? 我在 StackOverflow 上找不到类似的问题,但如果你有,我很乐意看到它们!

  2. 任何其他专业提示,有待改进的地方都会有所帮助。

【问题讨论】:

  • KeybindAction 严格一对一还是可以通过多个键执行操作?
  • 好问题。实现上是1对1的关系,用户可以通过一个接口修改keybind(wxWidgets的东西)
  • 使用 std::map(或 std::unordered_map)。要查看键是否绑定到操作,请检查映射是否包含键(std::map::count),要更改操作的键绑定,请将其从映射中删除并使用新的键绑定添加它。你拥有它的方式对我来说似乎有点倒退 - 你的代码将动作映射到键绑定,但我敢打赌你想查找给定键绑定的动作。地图应该可以解决这个问题。

标签: c++ oop composition


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      相关资源
      最近更新 更多