c++ - 在函数内创建唯一指针
问题描述
是否可以在类(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 中使用它们)
问题是,是否有更好的解决方案来实现我想要获得的东西?或者我可以通过做一些不同的事情来获得我正在使用的实现吗?
谢谢
解决方案
您的代码非常混乱,无法修复。
看起来你正在使用 Qt,所以只有正确使用QApplication
看起来像这样:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
你不需要或技能用它做任何其他事情。当应用程序没有 UI 模式时,文档中描述了此模式的唯一例外。
不要使用线程。我知道它们现在很流行,这是一个流行词,但它们很难掌握(多线程错误极难修复和理解,而且很容易编写可以在 90% 的计算机上运行并且总是失败的代码在 10% 的机器上),因此初学者应尽可能避免使用此功能。
首先掌握开发没有任何类型线程的 Qt 应用程序的基础知识。
推荐阅读
- java - 如何制作 setStudentName 方法?
- sql - 将数据设置为 Sql Db 时出现错误,说无法使用 Null 设置 Created at 的值
- typescript - ts-jest 单元测试的麻烦
- corda - 通过交互式外壳启动 Corda 流
- ruby-on-rails - 无法将 Rails 应用程序部署到 Google Cloud Run
- c - 使用多个 fprintf 语句将多行写入文件与 con-cat 多行然后使用一个 fprintf 语句写入文件?
- azure - 从非 www 重定向到 www 不使用 waf 在 azure 中工作不起作用
- javascript - Bulma 日历日期输入不显示预填充的开始日期
- c# - 如何使用反射区分直接子方法和继承的子方法?
- css - 带有文本阴影滞后的 Firefox,在 Chrome/Edge 上运行良好