首页 > 解决方案 > 在函数内创建唯一指针

问题描述

是否可以在类(nullptr)中声明一个unique_ptr,然后将其原始值(使用get())传递给创建它将指向的实例的函数?

我必须使用 Qt 制作的界面运行应用程序。Qt 需要 Qapplication 在更新 UI 的同一线程中启动。为此,由于我还使用 QP 框架(它具有类似于 qt exec() 的阻塞功能),因此我无法在我的 main 中执行此操作,因此我创建了一个包含 2 个 unique_ptr 的类:

//MyClass.h
std::unique_ptr<Qapplication> Core;
std::unique_ptr<MainWindow> UI;

然后在 MyClass 的构造函数中的代码中,我启动线程:

std::thread(&MyClass::threadfunc,this, UI.get(), Core.get());

线程是:

int MyClass::threadfunc(MainWindow* UI,Qapplication* Core){
   int dummy=0;
   Core = new QApplication(dummy,nullptr);
   UI= new MainWindows();
   UI->show;
   return Core ->exec();
}

我需要 MyClass 中的指针,因为我需要更新 UI,所以使用指向 mainwindows 的指针我应该能够调用它的方法,但是由于它必须在 QApplication 之后创建,所以我不能在我的类构造函数中对其进行引用。然后我决定在分离的线程中创建所有,因为我可以保证在 Qt 停止后我的类中的指针将被销毁,我读到可以将指针声明为唯一的(我可以只使用共享指针,但我想了解是否可以使用唯一指针)。要创建唯一的指针,我需要 make_unique 函数,但由于我传递了原始指针,所以我不能使用它。我什至不能传递指针,因为它们必须是唯一的(我在 MyClass 中使用它们)

问题是,是否有更好的解决方案来实现我想要获得的东西?或者我可以通过做一些不同的事情来获得我正在使用的实现吗?

谢谢

标签: c++qtunique-ptr

解决方案


您的代码非常混乱,无法修复。

看起来你正在使用 Qt,所以只有正确使用QApplication看起来像这样:

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

    MainWindow window;
    window.show();

    return app.exec();
}

你不需要或技能用它做任何其他事情。当应用程序没有 UI 模式时,文档中描述了此模式的唯一例外。

不要使用线程。我知道它们现在很流行,这是一个流行词,但它们很难掌握(多线程错误极难修复和理解,而且很容易编写可以在 90% 的计算机上运行并且总是失败的代码在 10% 的机器上),因此初学者应尽可能避免使用此功能。

首先掌握开发没有任何类型线程的 Qt 应用程序的基础知识。


推荐阅读