我已经构建了两次应用程序:一次是在Visual Studio中,另一次是在XCode中。我使用的一个库GLFW允许您使用glfwSetWindowSizeCallback函数来检测窗口的大小。
我的窗口类,window
,有两个私有成员,width和height。在调用我的回调时,window\u size\u callback
,我希望更新宽度和高度的值。然而,我想在不使用setter的情况下实现这一点。
所以,我把window\u size\u callback
变成了一个静态朋友。这个解决方案在VisualStudio编译器中运行良好;但是,XCode返回了一个错误:“static”在友元声明中无效。
窗口大小\u回调
:
void window_size_callback(GLFWwindow* window, int width, int height) {
Window* win = (Window*)glfwGetWindowUserPointer(window);
win->width = width;
win->height = height;
}
glfwGetWindowUserPointer
用于从类外部获取当前窗口实例。
头文件:
#include <GLFW/glfw3.h>
class Window {
private:
int m_width;
int m_height;
private:
friend static void window_size_callback(GLFWwindow* window, int width, int height);
}
如果没有friend关键字,window\u size\u callback
将无法访问这些成员。
为什么VS可以这样做,而XCode不行?
而且,我如何在不使用setter的情况下解决这个问题?
只需删除静态
。正如我在评论中解释的那样,这毫无意义。下面是一个片段,应该可以澄清一些问题:
class Window {
private:
int m_width;
int m_height;
private:
friend void window_size_callback(GLFWwindow*, int, int);
};
// as you can see 'window_size_callback' is implemented as a free function
// not as a member function which is what 'static' implies
void window_size_callback(GLFWwindow* window, int width, int height) {
Window* win = (Window*)glfwGetWindowUserPointer(window);
win->width = width;
win->height = height;
}
函数不能是类的静态成员。我猜VS允许语法作为扩展。不要指望它。
我无法使
问题内容: 如何在Python中声明静态属性? 这里写了我如何声明一个方法: Python中的静态方法? 问题答案: 在Python的类级别定义的所有变量均被视为静态 在类中,您可以使用相同的名称拥有两个不同的变量(一个静态变量和一个普通变量)。不要困惑。
在类中,static 除了可以声明 静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。 编译器在编译一个普通成员函数时,会隐式地增加一个形参 this,并把当前对象的地址赋值给 this,所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类来直接调用,编译器不会为它增加形参 th
本文向大家介绍C#静态构造函数?相关面试题,主要包含被问及C#静态构造函数?时的应答技巧和注意事项,需要的朋友参考一下 最先被执行的构造函数,且在一个类里只允许有一个无参的静态构造函数 执行顺序:静态变量>静态构造函数>实例变量>实例构造函数
问题内容: 为什么将Java常量声明为static? 在此我了解使用final吗?购买为什么它必须是静态的?为什么它应该是类变量,而不是实例变量? 问题答案: 如果它可以随类的实例而变化,那么显然它不是 常数 。为的每个实例获得不同的pi值意味着什么(甚至不允许构造实例)?还是每个实例的大小写不区分大小写?
问题内容: 我有一个快速的问题。在静态关键字声明之后立即开始的代码块,那是什么类型的方法?我从未见过。如果有人能启发我,将不胜感激。谢谢。 问题答案: 这不是方法,而是类的静态Initializer块。您可以在Java Language Specification中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。