0

我正在使用 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 执行此操作是否有任何问题?不知道为什么会这样。

谢谢你。

4

2 回答 2

2

shared_ptr您在评论中提到您在调用之前没有创建 a shared_from_this()。但这就是问题所在。x.shared_from_this()仅适用shared_ptrx存在一次。如果您从不创建一个,则您违反了 的前提条件shared_from_this(),因此您的程序具有未定义的行为。

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

于 2013-09-10T15:10:46.650 回答
1

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

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

谢谢

于 2013-09-10T15:38:38.093 回答