类静态函数内变量的非静态成员引用

时间:2014-05-05 09:19:56

标签: c++ oop opengl static callback

我想将主要源文件中的OpenGL功能带到一个单独的类中。

// Initialize rendering (GLUT and GLEW)
gfxMgr.init(argc, argv);
...
glutReshapeFunc(gfxMgr.resizeWindow);
glutKeyboardFunc(gfxMgr.keyPressed);
glutKeyboardUpFunc(gfxMgr.keyReleased);

问题始于定义类中的回调函数'实施文件。我在头文件中将它们声明为静态。

static void init(int , char** );
...
static void drawScene();
static void whenIdle();

然后又出现了另一个问题。我想在我的实现文件的一个静态函数中使用非静态布尔值的fullScreen变量(如标题中所声明的那样),但IDE告诉我"非静态成员引用必须相对于具体对象"。

void GfxMgr::init(int argc, char** argv)
{
    ...
    if(fullScr) glutFullScreen();
    ...
}

我不明白这个问题而且我不知道该怎么做。我将布尔值和其他一些变量声明为静态,但却出现了一堆未解决的外部符号错误。

1 个答案:

答案 0 :(得分:1)

  

我不明白这个问题

您需要了解静态成员函数是什么。例如,请参阅this tutorial。我还推荐前一个关于静态成员变量的文章。

简而言之,静态成员函数对类的实例一无所知。非静态成员变量绑定到类的实例。因此,静态成员函数无法使用非静态成员变量。

  

我不知道该怎么做。

你应该做什么取决于你的课程及其功能应该做什么。

  • 如果函数的行为应该依赖于实例的成员变量的值,那么该函数必须是非静态的,您必须在实例上调用它。
  • 如果函数应该只依赖于类的全局状态而不是实例,那么函数访问的变量必须是该全局状态的一部分(静态成员)。

C回调不能是成员函数。因此,它们不能依赖于实例的状态(全局实例除外,请参阅this tutorial