C++ 类内变量的非静态成员引用';静态函数
我想将OpenGL功能从主源文件转移到一个单独的类中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
// 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();
...
}