我正在写一个像对象一样的状态机。看起来像
Class A:
vector<Actions> m_enter_actions;
vector<Actions> m_exit_actions;
public:
ClassA....
~ClassA
SetEnterActions(vector<Actions> vector)
SetExitActions(vector<Actions> vector)
这是处理此问题的最佳方法吗?我想知道我是否应该喜欢
Class A:
EnterActions m_exit_actions;
ExitActions m_exit_actions;
public:
ClassA....
~ClassA
SetEnterActions(EnterActions& actions)
SetExitActions(ExitActions& actions)
EnterActions类是一个容器,它有自己的动作向量。这样,ClassA类不需要管理原始向量。
感谢任何帮助。我在课堂设计上非常糟糕。学习虽然:)
答案 0 :(得分:1)
SetEnterActions和SetExitActions函数的签名应设计为防止调用者知道ClassA如何存储Actions。 ClassA的用户不想知道ClassA是将它们存储在向量,双端队列,列表,还是EnterActions类中,或者其他什么。他们当然不希望将它们打包到ClassA存储的任何容器中。
我的第一个倾向是允许调用者提供一个迭代器,并允许调用者通过函数调用一次添加一个:
template <typename InputIterator>
AddEnterActions(InputIterator first, InputIterator last);
AddEnterAction(const Action &action);
因此,如果调用者将它们放在向量中,则调用AddEnterActions(vec.begin(), vec.end());
。如果他将他们放在一个数组中,他会调用AddEnterActions(arr, arr+size);
。如果他有一些不寻常的生成方法,他就不必把它们放入一个容器然后立即添加它们,并且他不必编写迭代器类来生成它们。当他弄清楚它们是什么时,他可以添加它们。
同时,如果ClassA将动作存储在向量中,那么实现就是:
template <typename InputIterator>
AddEnterActions(InputIterator first, InputIterator last) {
m_enter_actions.insert(m_enter_actions.end(), first, last);
}
AddEnterAction(const Action &action) {
m_enter_actions.push_back(action);
}
如果ClassA以后想要将它们存储在其他内容中,那么您不需要更改任何客户端代码。
在可能的情况下,首先根据呼叫者的需求设计界面。然后担心实施。当你发现它不可实现或者它要求该类执行非常低效的操作时,你有时必须返回并调整界面。但通常不会。
答案 1 :(得分:0)
如果您认为自己需要它们展示超出法向量的行为,请使用EnterActions和ExitActions。否则矢量很好,imo。