Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类内变量的非静态成员引用';静态函数_C++_Oop_Opengl_Static_Callback - Fatal编程技术网

C++ 类内变量的非静态成员引用';静态函数

C++ 类内变量的非静态成员引用';静态函数,c++,oop,opengl,static,callback,C++,Oop,Opengl,Static,Callback,我想将OpenGL功能从主源文件转移到一个单独的类中 // Initialize rendering (GLUT and GLEW) gfxMgr.init(argc, argv); ... glutReshapeFunc(gfxMgr.resizeWindow); glutKeyboardFunc(gfxMgr.keyPressed); glutKeyboardUpFunc(gfxMgr.keyReleased); 问题始于在类的实现文件中定义回调函数。我在头文件中将它们声明为静态 stat

我想将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();
接着又出现了另一个问题。我想在我的实现文件的一个静态函数中使用非静态布尔全屏变量(如标题中声明的),但IDE告诉我“非静态成员引用必须与特定对象相关”

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

我不明白这个问题

您需要了解什么是静态成员函数。例如,见。我还推荐上一篇关于静态成员变量的文章

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

我不知道该怎么办

您应该做什么取决于您的类及其函数应该做什么

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

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

如果非
静态成员函数未绑定到类的具体对象,则不能调用该函数
也是这个类的静态成员函数吗?@402:好吧,现在我已经将这些函数声明为静态的(正如我在OP中提到的)。如果不是,我确实使用了
gfxMgr.
来调用这些函数。@πάνταῥεῖ : 没有。我没有对glutFullScreen()做任何操作,我只调用了一次。好的。我已将一些函数更改回非静态,但改为:
错误C3867:'GfxMgr::drawsecene':函数调用缺少参数列表;使用“&GfxMgr::drawsecene”创建指向成员的指针
。因为它是回调,它不应该有任何参数,而且我已经在这个问题上用指针来处理了。安德烈:现在你有问题了,C++类成员函数不能用作C样式回调的回调。您需要在GLUT窗口和类实例之间创建一些关联。@Andrey,请参阅我答案中的第二个教程,3.5的第一个示例是thunking。但是,如果gl回调注册不允许向回调函数传递任意指针,则不能使用该选项。在这种情况下,您必须使用静态成员或使用全局实例的帮助函数。@Andrey:您需要一些映射,从GLUT窗口
int GLUTGETNOW(void)
到与该窗口关联的
GfxMgr
类实例。我建议在调用
glutCreateWindow
之后和注册回调之前,在
glutCreateWindow
中使用类型为
std::map
GfxMgr::init
的静态类成员,添加从GLUT窗口到类实例的新映射
window\u map[glutGetWindow()]=此。然后,在静态回调函数中,将静态蹦床包装到类实例方法中。
static void GfxMgr::s_display(){window\u map[glutGetWindow()]->display()}
@Andrey,您必须像示例B那样进行操作。它有一个静态成员函数
TClassB::Wrapper_来调用_display(char*string)
。要使用不带参数的回调,只需去掉参数。静态成员在全局实例上调用非静态成员函数。
void GfxMgr::init(int argc, char** argv)
{
    ...
    if(fullScr) glutFullScreen();
    ...
}