当前位置: 首页 > 知识库问答 >
问题:

如何声明静态C函数为OSX上的朋友

佟嘉祯
2023-03-14

我已经构建了两次应用程序:一次是在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的情况下解决这个问题?

共有1个答案

邢高澹
2023-03-14

只需删除静态。正如我在评论中解释的那样,这毫无意义。下面是一个片段,应该可以澄清一些问题:

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中 阅读有关它的更多信息。 加载该类后,其中的代码将执行一次。