Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数内创建唯一指针_C++_Qt_Unique Ptr - Fatal编程技术网

C++ 在函数内创建唯一指针

C++ 在函数内创建唯一指针,c++,qt,unique-ptr,C++,Qt,Unique Ptr,是否可以在类(nullptr)中声明唯一的_ptr,然后将其原始值(使用get())传递给创建它将指向的实例的函数 我必须运行一个带有Qt接口的应用程序。Qt需要Qapplication在更新UI的同一线程中启动。为此,由于我也在使用QP framework(它有一个类似于qt exec()的阻塞函数),所以我无法在main中执行此操作,因此我创建了一个包含2个唯一\u ptr的类: //MyClass.h std::unique_ptr<Qapplication> Core; st

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

我必须运行一个带有Qt接口的应用程序。Qt需要Qapplication在更新UI的同一线程中启动。为此,由于我也在使用QP framework(它有一个类似于qt exec()的阻塞函数),所以我无法在main中执行此操作,因此我创建了一个包含2个唯一\u ptr的类:

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

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之后创建,因此我无法在类构造函数中使用它。 然后我决定在分离的线程中创建all,因为我可以保证在Qt停止后类中的指针将被销毁,所以我读到可以将指针声明为唯一指针(我可以只使用共享指针,但我想了解是否可以使用唯一指针)。 要创建唯一指针,我需要make_unique函数,但由于我传递了原始指针,所以无法使用该函数。我甚至不能传递指针,因为它们必须是唯一的(我在MyClass中使用它们)

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


谢谢

您的代码太乱了,无法修复

看起来您正在使用Qt,因此只有正确使用
QApplication
时才会出现以下情况:

intmain(intargc,char*argv[])
{
QApplication应用程序(argc、argv);
主窗口;
window.show();
返回app.exec();
}
你没有必要或技能用它做任何其他事情。 当应用程序没有UI模式时,此模式的唯一例外情况如中所述

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

首先掌握在没有任何线程的情况下开发Qt应用程序的基础知识

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

你可以,但是你做这件事的方式(从你发布的有限代码中)听起来很复杂。为什么
threadfunc
需要接受原始指针?它不能接受唯一的指针吗?似乎可以,因为您控制
MyClass

不管怎样,也许这样的事情会实现你想要的。我们基本上是将
threadfunc
中的原始指针填充到类的唯一ptr中

#include <iostream>
#include <memory>
#include <thread>
#include <chrono>
struct A {
  std::unique_ptr<int> p;
  std::thread t1;
  A() {
    p = nullptr; //happens by default, but explicit for OP
    
  }

  void start()
  {
    //int *rawp_;
    t1 = std::thread(&A::threadfunc, this, p.get());
    //p = std::unique_ptr<int>{rawp_};
  }

  void threadfunc(int* rawp){
    rawp = new int(5);
    p = std::unique_ptr<int>{rawp};
    std::cout << "A::p " << *(p) << std::endl;
    std::cout << "Sleeping for 5 seconds" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(1000 * (*rawp)));
  }

  void end()
  {
    t1.join();
  }


};


int main()
{
  A a;
  // std::cout << *(a.p) << std::endl; //--> SEGFAULT
  a.start();      
  a.end();
}
#包括
#包括
#包括
#包括
结构A{
std::唯一的ptr p;
std::线程t1;
(){
p=nullptr;//默认情况下发生,但对于OP是显式的
}
void start()
{
//int*rawp;
t1=std::thread(&A::threadfunc,this,p.get());
//p=std::unique_ptr{rawp};
}
void threadfunc(int*rawp){
rawp=新整数(5);
p=std::unique_ptr{rawp};

std::cout当您将新对象作为参数传入时,为什么要在
threadfunc
中创建它们?
Core=new QApplication(dummy,nullptr)
在线程内!你在做什么?这段代码证明你是一个初学者,因此最好在你获得一些经验之前不要使用任何类型的线程。你似乎也在使用线程中的GUI元素,而不是执行
main
的线程中的GUI元素——这是不受支持的。@PaulSanders,因为指针已声明但未指向任何内容。问题是如果我共享该点,是否有可能在另一个线程中实例化该对象。您的代码没有共享任何内容。我不知道您正在尝试执行什么操作。我无法执行该操作,因为我的主程序有另一个点(因为我使用的是另一个框架)但是,由于我必须使用QT作为图形界面,并且它也会阻塞,我需要在另一个与我的对象通信的线程中运行它,以便更新UI。我了解到它必须在主线程中完成,但我也了解到可以在另一个线程中运行它,它应该可以正常工作,然后编辑您的问题添加信息n关于这两个框架,因为您的问题陈述不正确。这是的经典示例。我指定“它需要Qapplication在更新UI的同一线程中启动。要这样做,**因为我无法在我的主**中执行此操作,”-因为我的问题不是如何运行qt应用程序,而是如何以正确的方式传递指针。qt部分是为了提供一些上下文,以防有人已经在第二个线程中遇到运行qt的问题,并认识到这种情况。问题可能不清楚,因为它导致了这些问题,我将尝试编辑这就是我当时的想法,但我认为我不能在线程中使用p。我没有将其作为唯一ptr传递的原因是我必须将其移动到func,因此失去了所有权(不能通过值传递,我读到的是传递其引用的错误做法)但是我需要它在我的课堂上触发一些事件。我很明显是一个新手,因为它是我的第一个图形应用程序,但你似乎是唯一一个试图理解问题和回答它,你可以用我给你的信息,所以谢谢,好的。在这种情况下,考虑使用<代码> STD::SyrdYPPTR < /代码>,因为它似乎适合你。用例——也就是说,您希望引用count+并跨类边界拥有多个所有者。也可以查看移动语义(
std::move
)来移动所有权,尽管
#include <iostream>
#include <memory>
#include <thread>
#include <chrono>
struct A {
  std::unique_ptr<int> p;
  std::thread t1;
  A() {
    p = nullptr; //happens by default, but explicit for OP
    
  }

  void start()
  {
    //int *rawp_;
    t1 = std::thread(&A::threadfunc, this, p.get());
    //p = std::unique_ptr<int>{rawp_};
  }

  void threadfunc(int* rawp){
    rawp = new int(5);
    p = std::unique_ptr<int>{rawp};
    std::cout << "A::p " << *(p) << std::endl;
    std::cout << "Sleeping for 5 seconds" << std::endl;
    std::this_thread::sleep_for(std::chrono::milliseconds(1000 * (*rawp)));
  }

  void end()
  {
    t1.join();
  }


};


int main()
{
  A a;
  // std::cout << *(a.p) << std::endl; //--> SEGFAULT
  a.start();      
  a.end();
}