OOP:检查对象变量的其他实例的正确方法

时间:2013-05-09 23:27:15

标签: c++ oop composition

我有一组相关的课程,称之为

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可以向管理器查询更新的keybind。
  3. 让Action查询其他动作(据我所知,概念上并不是很好)。
  4. 我需要你

    1. 在可维护性,速度,易于理解和OOP适用性方面,最严格的方法是什么,实现检查是否已找到Keybind,是否出自我建议的解决方案或其他完全不同的方法。我已经尝试过1号 - 它有效,但我觉得它可能更好,你在挖? 我无法在StackOverflow上找到类似的问题,但如果你这样做我很乐意看到它们!

    2. 任何其他专业提示,需要改进的地方都很有帮助。

2 个答案:

答案 0 :(得分:1)

由于键绑定和操作之间只有1:1的关系,因此您可以从一个键绑定对象池开始,并在配置操作时从池中向下绘制。因此,在提供可用的配置密钥时,任何已绑定的密钥都不在可用池中。

答案 1 :(得分: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;
}