安全吸气剂到QStates
Safe getter to QStates
我有类,包含一个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*
将导致基本相同的行为,但每次访问都需要取消引用->
。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 通过网络、跨平台传递std::变体是否安全
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 在c++队列中使用pop和visit实现线程安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 安全到标准:移动会员?
- AcquireCredentialsHandleA() 返回 PFX 文件的0x8009030e(安全包中没有可用的凭据
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 安全吸气剂到QStates