C++:在没有对象实例的情况下调用非静态成员函数
C++: calling non-static member function without instance of object
我正在查看 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;
}
为什么调用方法get_size()
而不首先实例化Control
类型的对象然后调用其成员函数是合法的?我试图在我自己的文件中重新创建此行为,但它不会像我通常期望的那样编译:
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/control.cpp
我搜索了这个问题,发现 没有回答我的问题,因为在他的情况下,实际上有一个实例正在调用该方法(而且它是一种不同的语言)。
因为 PopupMenu
派生自 Control
,PopupMenu
的每个实例也是 Control
.
的实例
当 PopupMenu
的成员函数调用 get_size()
时,它会在自身上调用 Control 的 get_size()
函数。
或者换句话说,PopupMenu
有一个 get_size()
函数,因为它派生自 Control
。
在您的游戏中,PopupMenu
并非源自 Control
,因此这不适用。
我正在查看 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;
}
为什么调用方法get_size()
而不首先实例化Control
类型的对象然后调用其成员函数是合法的?我试图在我自己的文件中重新创建此行为,但它不会像我通常期望的那样编译:
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/control.cpp
我搜索了这个问题,发现
因为 PopupMenu
派生自 Control
,PopupMenu
的每个实例也是 Control
.
当 PopupMenu
的成员函数调用 get_size()
时,它会在自身上调用 Control 的 get_size()
函数。
或者换句话说,PopupMenu
有一个 get_size()
函数,因为它派生自 Control
。
在您的游戏中,PopupMenu
并非源自 Control
,因此这不适用。