Я смотрю на исходный код игрового движка 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
Iискал этот вопрос и обнаружил C #: вызов нестатической функции-члена без создания объекта , который не отвечает на мой вопрос, поскольку в его случае фактически был экземпляр, через который вызывался метод (и это другойязык).