C :在没有对象实例的情况下调用非静态成员函数

C++: calling non-static member function without instance of object

本文关键字:调用 情况下 静态成员 函数 实例 对象      更新时间:2023-10-16

我正在查看Godot游戏引擎的源代码,并遇到以下内容(有些为简单而省略):

// popup_menu.cpp
int PopupMenu::_get_mouse_over(double x) const
{
    if (x >= get_size().width)
        return -1;
    // ...
}

// control.cpp
Size2 Control::get_size() const
{
    return data.size_cache;
}

为什么在不先实例化Control的对象然后调用其成员函数的情况下调用方法get_size()合法?我试图在自己的文件中重新创建此行为,但是它不会像我通常期望的那样编译:

class Control
{
public:
    double get_size() const;
};
double Control::get_size() const
{
    return 5.0;
}
class PopupMenu
{
public:
    int _get_mouse_over(double d) const;
};
int PopupMenu::_get_mouse_over(double d) const
{
    return d > get_size(); // compile error, as expected
}

什么可能导致这种行为?如果您有兴趣,则可以在以下方式找到这些方法的实际源代码:

第110行:https://github.com/godotengine/godot/blob/master/scene/gui/popup_menu.cpp

第1770行:https://github.com/godotengine/godot/blob/master/scene/gui/gui/control.cpp

我搜索了这个问题并找到了C#:调用非静态成员函数而没有创建无法回答我的问题的对象,因为在他的情况下,实际上有一个方法是通过使用该方法来调用该方法(这是另一种语言)。

becuase PopupMenu源自 ControlPopupMenu的每个实例也是 Control的实例。

PopupMenu的成员函数调用get_size()时,它将自身调用Control的get_size()函数。

或不同的说明,PopupMenu具有get_size()函数,因为它是从Control派生的。

在您的娱乐中,PopupMenu不会源自Control,因此不适用。

相关文章: