C++ Qt:QWidgets和指针
我目前有3个类是公共QWidgets。 ->x,y,z都是qwidget 在我的主窗口中,我有指向x,y,z的指针 因此,各位成员:C++ Qt:QWidgets和指针,c++,qt,pointers,null,C++,Qt,Pointers,Null,我目前有3个类是公共QWidgets。 ->x,y,z都是qwidget 在我的主窗口中,我有指向x,y,z的指针 因此,各位成员: X* m_x; Y* m_y; Z* m_z; 成员函数: void MainWindow::deleteScreen(QWidget** widget) { if(widget != NULL) { delete widget; widget = NULL; } } 称为: deleteScreen(&
X* m_x;
Y* m_y;
Z* m_z;
成员函数:
void MainWindow::deleteScreen(QWidget** widget)
{
if(widget != NULL)
{
delete widget;
widget = NULL;
}
}
称为:
deleteScreen(&m_x)代码>->导致无效转换
如果我将deleteScreen
参数更改为QWidget*widget
并调用为deleteScreen(m_x)
它将删除内存,但不会将m_x
设置为空。(仅局部变量,小部件)
->有没有办法让deleteScreen
函数删除给定的小部件并将成员变量的值设置为NULL
谢谢大家! 实际上,;因此,您可能必须求助于模板:
template<typename T>
void deleteAndCleanup(T*& ptr)
{
delete ptr;
ptr = NULL;
}
// called like this:
deleteAndCleanup(m_x);
模板
无效删除和清除(T*&ptr)
{
删除ptr;
ptr=NULL;
}
//这样称呼:
删除和清除(m_x);
实际上,
;因此,您可能必须求助于模板:
template<typename T>
void deleteAndCleanup(T*& ptr)
{
delete ptr;
ptr = NULL;
}
// called like this:
deleteAndCleanup(m_x);
模板
无效删除和清除(T*&ptr)
{
删除ptr;
ptr=NULL;
}
//这样称呼:
删除和清除(m_x);
这里的问题不是您想删除QWidget,而是您正在使用指向它们的指针来确定它们是否已被删除
Qt对此有一个解决方案。对于QObject
类,可以使用QPointer
类作为保护。通过内部连接到对象的删除,它可以知道它所包含的QObject
是否已被删除
尝试以下操作作为代码的替代:
QPointer<X> m_x;
QPointer<Y> m_y;
QPointer<Z> m_z;
template<typename T>
void MainWindow::deleteScreen(QPointer<T> &widget)
{
if(!widget.isNull() && qobject_cast<QWidget>(widget) != 0)
{
widget->deleteLater();
}
}
QPointer m_x;
QPointer m_y;
QPointer m_z;
模板
void主窗口::删除屏幕(QPointer和小部件)
{
如果(!widget.isNull()&&qobject_cast(widget)!=0)
{
widget->deleteLater();
}
}
这里的问题不是您想删除QWidget,而是您正在使用指向它们的指针来确定它们是否已被删除
Qt对此有一个解决方案。对于QObject
类,可以使用QPointer
类作为保护。通过内部连接到对象的删除,它可以知道它所包含的QObject
是否已被删除
尝试以下操作作为代码的替代:
QPointer<X> m_x;
QPointer<Y> m_y;
QPointer<Z> m_z;
template<typename T>
void MainWindow::deleteScreen(QPointer<T> &widget)
{
if(!widget.isNull() && qobject_cast<QWidget>(widget) != 0)
{
widget->deleteLater();
}
}
QPointer m_x;
QPointer m_y;
QPointer m_z;
模板
void主窗口::删除屏幕(QPointer和小部件)
{
如果(!widget.isNull()&&qobject_cast(widget)!=0)
{
widget->deleteLater();
}
}
if(widget!=null&&*widget!=null){delete*widget;*widget=null;}
您确定必须删除Qwidget吗?好的,Qt实现了某种垃圾收集。Qt没有垃圾收集功能,但QObject是复合模式的实现,因此删除父对象时会删除所有子对象。我是否可以添加注释,在删除它之前不必测试空指针?删除空指针实际上定义得很好,并且可以。。。。没有什么。因此,删除if(widget!=NULL)。这是多余的,会使您的代码看起来不那么专业。;-)如果您真的想“删除”它并分配一个空值,为什么不使用引用呢。void main window::deleteScreen(QWidget*&widget)如果(widget!=null&&*widget!=null){delete*widget;*widget=null;}
您确定必须删除QWidget吗?好的,Qt实现了某种垃圾收集。Qt没有垃圾收集功能,但QObject是复合模式的实现,因此删除父对象时会删除所有子对象。我是否可以添加注释,在删除它之前不必测试空指针?删除空指针实际上定义得很好,并且可以。。。。没有什么。因此,删除if(widget!=NULL)。这是多余的,会使您的代码看起来不那么专业。;-)如果您真的想“删除”它并分配一个空值,为什么不使用引用呢。void MainWindow::deleteScreen(QWidget*&widget)您不需要在引用的版本中检查NULL。在空指针上调用delete完全可以。(当然,您仍然需要在接受指针的版本中检查NULL,因为它会被取消引用。)@NikosC.:它们中的任何一个都不需要NULL检查;如果双指针为NULL,则调用者中存在严重的逻辑缺陷,因此segfault是非常值得的。嘿,我尝试了第一种解决方案,但这导致无效转换:错误:从“X**”到“QWidget**”的转换无效[-fpPermissive]第二个解决方案还提供了一个错误:错误:调用“MainWindow::deleteScreen(X*&)”时没有匹配的函数@secondVISION:第二个解决方案提供了该错误,因为您没有更新类
块内的声明,但它遇到了与第一个相同的问题(不能使用对指向基类的指针的引用来传递指向派生类的指针);有关替代解决方案,请参阅更新的答案。不需要在引用的版本中检查NULL。对NULL指针调用delete完全可以。(当然,您仍然需要在使用指针的版本中检查NULL,因为它会被取消引用。)@NikosC.:它们中的任何一个都不需要NULL检查;如果双指针为NULL,则调用者中存在严重的逻辑缺陷,因此segfault是非常值得的。嘿,我尝试了第一个解决方案,但这给了我无效的转换:错误:从“X**”到“QWidget**”的无效转换[-fpermissive]第二个解决方案还提供了一个错误:错误:调用“MainWindow::deleteScreen(X*&)”时没有匹配的函数@secondVISION:第二个解决方案提供了该错误,因为您没有更新类
块内的声明,但它遇到了与第一个相同的问题(不能使用指向基类的指针的引用来传递指向派生类的指针);请参阅更新的答案以获得替代解决方案。我认为&&qobject_cast(widget)!=0
部分没有真正的用处