Qt QObject和boost :: enable_shared_from_this

时间:2013-09-10 11:21:01

标签: c++ qt boost shared-ptr qobject

我正在使用boost :: enable_shared_from_this模板在两个类之间创建一个mixin。所以我在这个类中添加了一个新功能:

class MyOldClass :
        public Connection,
        public boost::enable_shared_from_this<MyOldClass>
{ ... };

之前我使用过普通类(不是QtObject,只是一个C ++普通类),并且一切正常。

但现在我正在使用QMainWindow做同样的事情,它基本上崩溃了:

class MainWindow :
        public QMainWindow,
        public Connection,
        public boost::enable_shared_from_this<MainWindow>
{ Q_OBJECT ... };

使用QObject可能有任何问题吗?不知道为什么会这样。

谢谢。

2 个答案:

答案 0 :(得分:2)

您在评论中提到,在致电shared_ptr之前,您没有创建shared_from_this()。但这就是问题所在。 x.shared_from_this()仅在shared_ptrx存在时才有效。如果你从不创建一个,那么你违反了shared_from_this()的前提条件,所以你的程序有不确定的行为。

shared_from_this()仅用于检索与现有共享指针共享所有权的指针;它不能用于创建第一个。

答案 1 :(得分:1)

好的伙计们,这是我的错,但答案可能对某人有所帮助:

  1. 正如Angew所说,有必要使用shared_ptr创建MainWindow的第一个实例(我第一次不理解你的问题)。
  2. 我这样做但是我使用的是std :: shared_ptr实现而不是boost :: shared_ptr。混合两者产生了这个结果。
  3. 它现在有效但是正如Angew说的那样,必须非常小心地使用shared_ptr和Qt所有权方案。
  4. MainWindow声明中指定的继承顺序是唯一有效的继承顺序。正如Angew所说:“当继承自QObject或从它派生的类时,QObject(或派生类)必须是基类列表中的第一个。所以这将不起作用”
  5. 谢谢