如何通过值返回“ QObject”派生的类?

pablo_worker

为了提高代码的可读性,我想在函数内部创建一个对象,然后按值返回它(我让编译器执行优化内存的任务)。

如果我有普通班,我可以做以下事情:

MyClass myFunction01()
{
  MyClass theRegularObject;
  //do things
  return theRegularObject;
}

因此,在我的代码中,我可以执行以下操作:

MyClass myObject = myFunction01();

但是,如果MyClass是QObject派生的(让我们称之为QObjDerivedClass),则会出现编译错误:

QObjDerivedClass::QObjDerivedClass(const QObjDerivedClass &) : attempting to reference a deleted function.

我认为问题在于QObject没有复制构造函数或赋值运算符QObject Doc

作为可能的解决方案,我认为以下解决方案是可行的,但也许我错过了更好的解决方案?

1,在main中创建对象并将对象作为对函数的引用

void myFunction01(CMyClass &theObj) {//do things}

//In my program
CMyClass myObj;
myFunction01(myObj);

2.在函数内部创建一个动态对象并返回一个指针(一个智能指针?)

QSharedPointer<CMyClass> myFunction01()
{
  QSharedPointer<CMyClass> p_theObj(new CMyClass);            
  //do things
  return p_theObj;
}

//At my program
QSharedPointer<CMyClass> p_myObj = myFunction01();

//When p_myObj goes out of scope the CMyClass object will be deleted.
//WARNING: Very important not to set a parent when we create the CMyClass object. 
//Otherwise, we will have problems due to double deletion.

有更好的/其他想法吗?

从设计上讲,QObject绝对不要将a传递给值。

Qt对象模型要求我们将Qt对象视为身份,而不是值。值被复制或分配;身份被克隆...因此,QObject和QObject的所有子类(直接或间接)都禁用了其复制构造函数和赋值运算符。来源

因此,您的原始示例本质上是错误的。相反,您应该使用指针QObjects(和QObject派生类)进行交互

Qt的标准做法是使用分配对象在堆上new只要对象具有适当的父对象,它将自动销毁

所有子对象均被删除。如果这些对象中的任何一个位于堆栈或全局对象上,则您的程序迟早会崩溃。来源

这种做法可以在官方样本中看到,例如this对象是在堆上显式分配的,清理(delete)留给父对象处理。

总结一下:QObject在堆上分配派生的对象,并通过指针传递它们。

注意:如果您想使用智能指针,此答案对Qt内置的指针有很好的总结。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章