【问题标题】:Why there is no overloaded operator T* () in class QSharedPointer为什么QSharedPointer类中没有重载运算符T*()
【发布时间】:2014-09-10 09:35:03
【问题描述】:

但是,QSharedDataPointer 类有它。

我总是必须定义一个 Class::pointer typedef 来缩写,并使用 Class::pointer(new Class) 创建一个指针。

有人知道原因吗?

【问题讨论】:

  • 你能举个例子吗?
  • 您不希望意外地将共享指针转换为原始指针并被悬空指针卡住。如果要存储指向具有共享所有权的对象的指针,请存储共享指针(或弱指针)。如果您需要将原始指针传递给某个接口,那么您需要确保对象的生命周期足够长。因此,从共享指针到原始指针的隐式转换是自找麻烦。
  • “我总是必须……”——不,你不需要。 ptr.data() 完全按照您希望操作员执行的操作,没有意外破坏共享语义的危险。

标签: c++ qt smart-pointers qsharedpointer


【解决方案1】:

我怀疑 T* () 运算符不存在的原因是因为 T* data() function 与许多其他 Qt 类(如 QString、QByteArray 等)一样,都提供了一个 data() 函数来访问Qt 类的底层数据。

这维护了一个跨 Qt 类的标准接口。

此外,通过重载运算符,如果要更改基础数据而没有在此处实现,则很容易出错。在我看来,使用 data() 函数可以让你在做什么更加明显。

QSharedPointer 的data() 函数也警告不要删除返回的指针,或将其传递给任何可能删除它的东西,所以我认为它是一个函数,如果你真的需要它就在那里,但如果你能更好避免它,如果你确实使用它,请仔细考虑发生了什么。

至于QSharedDataPointer,这里根据the documentation,调用操作符调用detach(),可以安全调用。

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2019-10-13
    • 2020-03-03
    • 1970-01-01
    • 2014-03-22
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多