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;
}
为什么在不先实例化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
源自 Control
, PopupMenu
的每个实例也是 Control
的实例。
当PopupMenu
的成员函数调用get_size()
时,它将自身调用Control的get_size()
函数。
或不同的说明,PopupMenu
具有get_size()
函数,因为它是从Control
派生的。
在您的娱乐中,PopupMenu
不会源自Control
,因此不适用。
相关文章:
- 在这种情况下,java对象是否可以调用本机函数
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- Doxygen - 如何在不生成图形的情况下生成文本调用关系结果
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- C++ - 如何在不调用其属性的情况下调用类?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,工会成员会调用自己的析构函数吗
- 如何在不迭代的情况下对数组中的每个元素调用方法
- C++-在没有自定义.lib文件的情况下从Lua C模块调用Lua函数
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- C++ 在不释放内存的情况下调用析构函数
- Python在不引用类名的情况下调用类函数
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C ++:如何在不创建对象的情况下在主函数中调用方法
- 为什么在这种情况下调用非常量右值移动构造函数?
- 在这种情况下,我应该为每个WSASend调用传递唯一的重叠结构吗?
- C++ 在不知道子类型的情况下从父类型调用子方法