C++11 非拥有引用/指向 unique_ptr 的指针?

标签 c++ pointers reference unique-ptr

这不是“如何做”的问题,而是“如何以正确的方式做”的问题

我正在 Qt 中开发一个编辑器,其中不同的小部件显示子项及其(成员)变量。这些小部件中的每一个都应该保存一个指向已编辑子项的引用/指针,以显示和更改它们的成员变量。

第一次尝试是我学习(并且仍然有点坚持)的旧 ANSI C 方法,使用指向所用对象的简单原始指针。它工作正常,但由于 C++11 标准支持智能指针并建议使用它们,我正在尝试使用它们。

问题是,我不太确定在这种情况下使用它们的“最佳方式”是什么...... 看完Smart Pointers: Or who owns you baby?Which kind of pointer do I use when?和其他一些我得出了不同的结论:

第一种是使用*unique_ptr,因为被编辑的对象显然是创建和删除其子对象的所有者。小部件只是引用子项来显示或更改它们。 问题是小部件应该如何引用子...

现在我仍然简单地使用我通过 unique_ptrget() 方法获得的原始指针,但这对我来说似乎有点缺陷。 我仍然可以不小心调用指针上的 delete 并取消智能指针的好处。

第二种方法是使用 shared_ptr,因为许多对象都引用子对象并对其进行编辑。在一个小部件中不小心删除它也不会造成伤害,因为它仍然由其他对象拥有。 问题是他们拥有它。当我想从编辑的对象中删除它时,我还必须在它真正消失之前通知所有小部件将其删除。 (这又一次看起来有缺陷且容易出错)

我对这两种方式都不满意。是否有一种干净(呃)的方式来指向对象的 unique_ptr 子对象?还是我错过了解决这个问题的完全不同且更好的方法?

最佳答案

您的用例不会直接转化为需求(如果其他人在您编辑小部件时删除了它怎么办?)但我假设除了裸指针之外您不需要任何东西。

标准库不提供任何严格的指针观察者类。在观察实体中:

  • native 类型的可空可变指针 ( T * )
  • native 类型的不可空、不可更改的引用 (T &)
  • 类类型 ( std::reference_wrapper<T> ) 的不可空、可变引用/代理
  • 指向托管对象的可空、自验证、可变指针 (std::weak_ptr<T>)

如果您想要一个指向非托管对象的不可为空的可变指针,这是一个相当合理的需求,您可以自己动手。

但是裸指针并没有那么糟糕。唯一的区别是它可以是 nullptr ,并且它在命名空间 std 中没有一个漂亮的、长的、明确的名称.

关于C++11 非拥有引用/指向 unique_ptr 的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18455456/

相关文章:

c++ - 我有一个引用,想调用一个采用 boost::shared_ptr 的函数

c++ - 无法将着色器发送到 GPU 内存

c++ - 向 QSettings 编写和读取自定义类

c++ - 在构造函数 C++ 中创建指向对象的指针

java - Java 中的链表引用

jquery - 有 AJAX 引用吗? ajaxSubmit() 的作用是什么?它内置于 jQuery 中吗?

c++ - 即使没有明确定义为内联,一个非常短的函数也可以内联吗?

c++ - 使用映射迭代器编译错误

c - 为什么C在调用汇编函数时不将指针压入堆栈?

c - 如何在函数之间更改指针值