这不是一个“如何做”而是“如何以正确的方式做”的问题。
我正在使用Qt开发一个编辑器,其中不同的小部件会显示子级及其成员变量。每个小部件都应该持有对编辑的子对象的引用/指针,以显示和更改它们的成员变量。
第一次尝试是我学过(并且还在使用)的旧ANSI C方式,即使用简单的原始指针来引用已使用的对象。虽然这种方法很好用,但由于C++11标准支持智能指针并建议使用它们,我正在尝试使用它们。
问题是,我不太确定在这种情况下应该使用哪种智能指针……阅读了智能指针:谁拥有你?和我什么时候使用哪种指针?和其他一些文章后,我得出了不同的结论:
第一种方法是使用*unique_ptr
,因为明显被编辑的对象是所有者,它创建并删除其子项。小部件只是引用子项以显示或更改它们。
问题在于小部件应该如何引用子项......
目前我只是使用通过unique_ptr
的get()
方法得到的原始指针,但这似乎有些不完善。我仍然可能意外调用指针的delete函数并取消智能指针的好处。第二种方法是使用
shared_ptr
,因为许多对象都引用并编辑它。同时,在一个小部件中意外删除它也不会有任何影响,因为它仍然被其他对象拥有。
问题在于它们拥有它。当我想从已编辑的对象中删除它时,我还必须通知所有小部件在它真正消失之前删除它。(这似乎又有缺陷且容易出错)我对这两种方法都不太满意。是否有一种更清洁的方式来指向对象的
unique_ptr
子项?或者我错过了完全不同且更好的解决此问题的方法?
delete
,那么就永远不会“意外地”调用指针上的delete
。因此,如果你仍然可能在指针上“意外地”调用delete
,那只有在你确实使用了delete
时才会发生。简而言之,禁止你的代码中所有对delete
的使用即可。 - Nicol Bolasabort()
函数。意外是看人的眼光而定的。 - Potatoswatterunique_ptr
的对象,它们是QObject
的子类吗?如果是的话,请确保它们没有父对象,并考虑使用Qt的父子机制而不是智能指针,并考虑使用QPointer
作为QObject
的智能指针。如果它们不是QObject
的子类,则可以使用std::
的智能指针。 - hyde