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

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


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

由于状态是私有的,但我想允许用户继承并改变某些行为(例如添加过渡,更改属性,连接信号等),因此我想添加一些吸气剂。我没有添加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 ++还是陌生的,所以我不确定我是否知道自己在那做过什么以及是否有其他影响。

什么是实现我期望的行为的正确方法?

最佳答案

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

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


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

10-06 01:56