本人在类内定义了一个函数
class Welcome
{
public:
Welcome(char* pixmap);
~Welcome();
private:
Texture *tex;
void mouse(int button, int state, int x, int y);//这个mouse函数
};
回调函数是一个void(*)(int,int,int,int);
Welcome::Welcome(char *pixmap)
{
tex = new Texture(pixmap);
tex->analyse();
glutMouseFunc(mouse);//这里显示出错
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tex->getID());
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(-1.5, -1.5, 0);
glTexCoord2f(1, 0); glVertex3f(1.5, -1.5, 0);
glTexCoord2f(1, 1); glVertex3f(1.5, 1.5, 0);
glTexCoord2d(0, 1); glVertex3f(-1.5, 1.5, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
}
会报这个错误 强制转换也不行 这是什么原因 怎么解决 求指导
解决方案:20分
void Welcome::mouse(int button, int state, int x, int y);//实际上有5个参数
Welcome a ;
a.mouse(..);//这样调用时第五个参数就是&a,也就是this指针,这是由编译器完成的
导致和普通的函数肯定不一样
特别的具有捕获性质的lambda函数其实也是通过匿名类的实现的
不过函数的说明为static的话,就不会加上this,这就是static函数不能访问其它成员的原因,实际上这个时候类只起到了命名空间的作用
假如你想在回调函数中访问其它地方的资源,你可以写个函数
thread_local int _data ;
void savedata (int d)//或void*也行
{_data = d}
int getdata (){return _data}
当然假如你要用到这种设计模式的时候你该想想你的设计能否出现问题了
Welcome a ;
a.mouse(..);//这样调用时第五个参数就是&a,也就是this指针,这是由编译器完成的
导致和普通的函数肯定不一样
特别的具有捕获性质的lambda函数其实也是通过匿名类的实现的
不过函数的说明为static的话,就不会加上this,这就是static函数不能访问其它成员的原因,实际上这个时候类只起到了命名空间的作用
假如你想在回调函数中访问其它地方的资源,你可以写个函数
thread_local int _data ;
void savedata (int d)//或void*也行
{_data = d}
int getdata (){return _data}
当然假如你要用到这种设计模式的时候你该想想你的设计能否出现问题了