C ++: вызов нестатической функции-члена без экземпляра объекта - PullRequest
0 голосов
/ 15 марта 2019

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

1 Ответ

1 голос
/ 15 марта 2019

Becuase PopupMenu происходит от Control, каждый экземпляр PopupMenu также является экземпляром Control.

Когда функция-член PopupMenu вызывает get_size(), она сама вызывает функцию get_size() элемента управления.

Или, иначе говоря, PopupMenu имеет функцию get_size(), поскольку она получена из Control.

В вашем отдыхе, PopupMenu не происходит от Control, поэтому это не относится.

...