安全吸气到QStates

时间:2017-08-21 14:56:13

标签: c++ qt c++11 qt5

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

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

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

由于状态是私有的,但我想允许用户子类化并改变某些行为(例如添加转换,更改属性,连接到信号e.t.c)我想添加一些getter。我没有添加setter,正如文档所述:

  

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

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 ++的新手,我不确定我知道我在那里做了什么以及是否还有其他含义。

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

1 个答案:

答案 0 :(得分:1)

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

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

在这种情况下,返回的对象的类型为const QState&,因此无法将其指定为非const函数调用的接收器对象。至于 right 实现此行为的方式,返回const QState*将导致基本相同的行为,但需要为每次访问取消引用->