我可以在 QT 中的空对象上调用非静态方法吗
can I invoke non-static method on null object in QT
它是如何工作的?
QDesktopWidget *Desktop=NULL;
auto Desktop_Rect=Desktop->screenGeometry();
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height(); //1440,900
如果我重写如下:
auto Desktop_Rect=QDesktopWidget::screenGeometry();//Error:screenGeometry is not a static method.
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height();
基本上你的问题与 Qt
关系不大,但与 C++
.
关系不大
调用方法不需要指针,需要指针的类型。
该方法可能未使用 this
,因此它运行代码时很好。
行为应该是未定义的,取决于screenGeometry
方法的实现。
P.S。编译警告并且不要忽略它们(由 Jeoren 在评论中建议)
这适用于您在 NULL 指针上调用 class 方法的所有情况。编译器不会(不能)在编译时检查指针的有效值。它只查看指针的类型,只要检查出来(在这种情况下,QDesktopWidget class 确实有一个名为 screengGeometry 的函数,它接受 0 个参数)它就会愉快地编译您的代码。
但是,在运行时,一旦该函数中的代码访问 class 的数据成员,这很可能会崩溃。那就是当它试图取消引用 "this" 指针时,在本例中为 NULL。您的第一个示例成功运行的事实仅意味着它不访问实例数据,而仅访问静态或全局数据。
第二个片段是完全不同的情况,您试图调用一个方法,就好像它是静态的,而实际上不是。这会导致您引用完全正确且有用的错误消息。
尽管问问你自己:当你调用 screenGeometry 时函数 return 应该是什么,而没有它所属的实例。两个代码片段都试图做一些荒谬的事情。
它是如何工作的?
QDesktopWidget *Desktop=NULL;
auto Desktop_Rect=Desktop->screenGeometry();
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height(); //1440,900
如果我重写如下:
auto Desktop_Rect=QDesktopWidget::screenGeometry();//Error:screenGeometry is not a static method.
pDebug()<<Desktop_Rect.width()<<","<<Desktop_Rect.height();
基本上你的问题与 Qt
关系不大,但与 C++
.
调用方法不需要指针,需要指针的类型。
该方法可能未使用 this
,因此它运行代码时很好。
行为应该是未定义的,取决于screenGeometry
方法的实现。
P.S。编译警告并且不要忽略它们(由 Jeoren 在评论中建议)
这适用于您在 NULL 指针上调用 class 方法的所有情况。编译器不会(不能)在编译时检查指针的有效值。它只查看指针的类型,只要检查出来(在这种情况下,QDesktopWidget class 确实有一个名为 screengGeometry 的函数,它接受 0 个参数)它就会愉快地编译您的代码。
但是,在运行时,一旦该函数中的代码访问 class 的数据成员,这很可能会崩溃。那就是当它试图取消引用 "this" 指针时,在本例中为 NULL。您的第一个示例成功运行的事实仅意味着它不访问实例数据,而仅访问静态或全局数据。
第二个片段是完全不同的情况,您试图调用一个方法,就好像它是静态的,而实际上不是。这会导致您引用完全正确且有用的错误消息。
尽管问问你自己:当你调用 screenGeometry 时函数 return 应该是什么,而没有它所属的实例。两个代码片段都试图做一些荒谬的事情。