【发布时间】:2020-07-02 15:44:03
【问题描述】:
是否可以在类中声明一个 unique_ptr (nullptr),然后将其原始值 (使用 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 中使用它们)
问题是,有没有更好的解决方案来实现我想要获得的东西?或者我可以通过我正在使用的实现来获得它吗?
谢谢
【问题讨论】:
-
当你作为参数传入
threadfunc时,为什么要在它们中创建新对象? -
Core = new QApplication(dummy,nullptr);在线程内!你在做什么?这段代码证明你是一个初学者,所以在你获得一些经验之前最好不要使用任何类型的线程。 -
您似乎还使用了线程中的 GUI 元素,而不是
main正在执行的线程——这是不受支持的。 -
@PaulSanders 因为指针已声明但未指向任何内容。问题是如果我共享指针,是否可以在另一个线程中实例化对象
-
您的代码没有共享任何内容。我不知道你想做什么。
标签: c++ qt unique-ptr