为了提高代码的可读性,我想在函数内部创建一个对象,然后按值返回它(我让编译器执行优化内存的任务)。
如果我有普通班,我可以做以下事情:
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的所有子类(直接或间接)都禁用了其复制构造函数和赋值运算符。(来源)
因此,您的原始示例本质上是错误的。相反,您应该使用指针与QObject
s(和QObject
派生类)进行交互。
Qt的标准做法是使用分配对象在堆上new
。只要对象具有适当的父对象,它将自动销毁。
所有子对象均被删除。如果这些对象中的任何一个位于堆栈或全局对象上,则您的程序迟早会崩溃。(来源)
这种做法可以在官方样本中看到,例如this。对象是在堆上显式分配的,清理(delete
)留给父对象处理。
总结一下:QObject
在堆上分配派生的对象,并通过指针传递它们。
注意:如果您想使用智能指针,此答案对Qt内置的指针有很好的总结。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句