QStates 的安全吸气剂

Posted

技术标签:

【中文标题】QStates 的安全吸气剂【英文标题】:Safe getter to QStates 【发布时间】:2017-08-21 14:56:13 【问题描述】:

我有课,包含QStateMachine。它还有几个QState*s。

private:
QStateMachine m_machine;
QState* m_state1
QState* m_state2
...

我在构造函数中初始化状态机,并设置机器运行。

由于状态是私有的,但我想允许用户子类化并改变一些行为(例如,添加转换、更改属性、连接到信号等)我想添加一些 getter。正如文档所述,我不添加设置器:

不鼓励在机器运行时删除状态。

QtCreator 产生类似的东西:

QState *MyClass:state1() const

    return m_state1;

看起来不错。

但在我看来,这也绕过了我不提供 setter 的决定,因为这样的事情是可能的:

QState* state = state1();
*state = QState([...]);

据我了解,它删除了原来的 state1 并用新状态覆盖它。

所以我的想法是改为返回const QState*

const QState* MyClass::state() const

    return m_state1;

哪个似乎可以工作(上面的示例将引发编译器错误)。但是我是 C++ 的新手,我不确定我是否知道我在那里做了什么以及是否有其他影响。

实现我想要的行为的正确方法是什么?

【问题讨论】:

【参考方案1】:

如果希望用户能够检索状态,但又不能影响检索到的状态对象,可以考虑使用常量引用返回类型

const QState& MyClass::state() const

    return *m_state1;

在这种情况下,返回的对象是const QState& 类型,因此它不能被分配给或成为非常量函数调用的接收者对象。至于实现此行为的正确方法,返回const QState* 将导致基本相同的行为,但每次访问都需要使用-> 取消引用。

【讨论】:

谢谢!我想我明白了一点,但我意识到,我无法强制执行我的愿望,例如QStates addTransition 不是 const,需要一个指向另一个 QState 的普通指针。因此我需要允许非常量访问指针。

以上是关于QStates 的安全吸气剂的主要内容,如果未能解决你的问题,请参考以下文章

没有为类型“Future<List<Item>>”定义吸气剂“长度”

了解 Nuxt.js 中的状态和吸气剂:吸气剂不起作用

类内的吸气剂模式?

Vuex:为啥我们用大写字母编写突变、动作和吸气剂?

吸气剂'loadingStatus'在空颤时被调用

包含 Handler 的吸气剂