我已经构建了两次应用程序:一次在Visual Studio中,另一次在XCode中。我使用的其中一个库GLFW允许您使用glfwSetWindowSizeCallback
函数来检测窗口的大小调整。
我的窗口类Window
有两个私有成员,宽度和高度。在调用我的回调函数window_size_callback
时,我希望更新宽度和高度的值。但是,我想在不使用setter的情况下这样做。
所以,我让window_size_callback
成了一个静态的朋友。这个解决方案在Visual Studio编译器中运行得很好;但是,XCode返回了一个错误:'static'在好友声明中无效。
window_size_callback
:
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_size_callback
将无法访问这些成员。
为什么VS和XCode没关系?
而且,如何在不使用setter的情况下解决这个问题?
答案 0 :(得分:1)
只需删除static
即可。正如我在评论中所解释的那样没有任何意义。这是一个应该清除事物的片段:
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;
}
friend
函数不能是类的static
成员。我猜测VS允许语法作为扩展。别指望它。