这不是“如何做”的问题,而是“如何以正确的方式做”的问题
我正在 Qt 中开发一个编辑器,其中不同的小部件显示子项及其(成员)变量。这些小部件中的每一个都应该保存一个指向已编辑子项的引用/指针,以显示和更改它们的成员变量。
第一次尝试是我学习(并且仍然有点坚持)的旧 ANSI C 方法,使用指向所用对象的简单原始指针。它工作正常,但由于 C++11 标准支持智能指针并建议使用它们,我正在尝试使用它们。
问题是,我不太确定在这种情况下使用它们的“最佳方式”是什么...... 看完Smart Pointers: Or who owns you baby?和 Which kind of pointer do I use when?和其他一些我得出了不同的结论:
第一种是使用*unique_ptr
,因为被编辑的对象显然是创建和删除其子对象的所有者。小部件只是引用子项来显示或更改它们。
问题是小部件应该如何引用子...
现在我仍然简单地使用我通过 unique_ptr
的 get()
方法获得的原始指针,但这对我来说似乎有点缺陷。
我仍然可以不小心调用指针上的 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/