安全吸气剂到QStates

Safe getter to QStates

本文关键字:QStates 安全      更新时间:2023-10-16

我有类,包含一个QStateMachine.它也有几QState*

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

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

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

不建议在计算机运行时删除状态。

QtCreator 生成类似的东西:

QState *MyClass:state1() const
{
return m_state1;
}

这看起来不错。

然而,在我看来,这也规避了我不提供二传手的决定,因为这样的事情是可能的:

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

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

所以我的想法是返回一个const QState*

const QState* MyClass::state() const
{
return m_state1;
}

似乎有效(上面的示例将抛出编译器错误(。然而,我对C++是新手,我不确定我是否知道我在那里做了什么,以及是否有其他影响。

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

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

const QState& MyClass::state() const
{
return *m_state1;
}

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