gpt4 book ai didi

c++ - 类对象状态机的类设计思路

转载 作者:行者123 更新时间:2023-11-28 08:31:48 26 4
gpt4 key购买 nike

我正在编写一个类似对象的状态机。看起来像

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 类将是一个容器,它有自己的 Action vector 。这样 ClassA 类就不需要管理原始 vector 。

感谢任何帮助。我很不擅长类(class)设计。虽然学习:)

最佳答案

SetEnterActions 和 SetExitActions 函数的签名应该设计为防止调用者知道 ClassA 如何存储 Actions。 ClassA 的用户不想知道 ClassA 是否将它们存储在 vector 、双端队列、列表、EnterActions 类或其他任何内容中。他们当然不想将它们打包到 ClassA 存储它们的任何容器中。

我的第一个倾向是允许调用者提供一个迭代器,并允许调用者通过函数调用一次添加一个迭代器:

template <typename InputIterator>
AddEnterActions(InputIterator first, InputIterator last);

AddEnterAction(const Action &action);

因此,如果调用者将它们放在 vector 中,他将调用 AddEnterActions(vec.begin(), vec.end());。如果他将它们放在一个数组中,他将调用 AddEnterActions(arr, arr+size);。如果他有一些不寻常的方法来生成它们,他就不必乱七八糟地将它们放入容器中然后一次添加它们,也不必编写迭代器类来生成它们。他可以在弄清楚它们是什么时添加它们。

同时,如果 ClassA 将 Action 存储在一个 vector 中,那么实现就是:

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 稍后想将它们存储在其他东西中,那么您不需要更改任何客户端代码。

在可能的情况下,首先根据调用者的需求设计界面。然后担心实现。当您发现它无法实现或它要求类做一些非常低效的事情时,有时您必须返回并调整接口(interface)。但通常不会。

关于c++ - 类对象状态机的类设计思路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com