我想创建一个类来保存我的变量,许多函数将使用它们,如鼠标位置和其他东西。这就是我所做的:
test.h:
class test{
public:
test();
virtual ~test();
void update(int n);
//Desenhar
void draw(void);
private:
int mx, my; //Mouse variables
};
TEST.CPP:
test::test(){
}
test::test(){
}
void test::update(int n){
glutTimerFunc(20, this->update, 0);
}
void test::draw(void){
...
circle(mx, my);
...
}
我遇到的问题是我无法将更新方法与glutTimerFunc()
(例如glutTimerFunc(20, this->update, 0);
)一起使用,因为它不是static
函数。即使我正在使用object.update(在我为main
类创建实例的object
函数上),它也表示参数类型不匹配(error: argument of type 'void (test::)(int)' does not match 'void (*)(int)'
)
如果我将其更改为静态(因为这里有很多问题说我应该),我不能在绘制方法中使用mx或my,因为它没有实例。
有什么解决方案吗?我这样做是因为我需要在很多方法中使用一些变量,最好的方法是在main函数和这个类中的所有方法上创建这个类的实例。我在做一些我不该做的事情吗?
很抱歉,如果解决方案很简单,我是C ++的新手,从未使用过这种方式,这是第一次。
答案 0 :(得分:0)
我目前使用的解决方案涉及实例方法的全局包装。
您需要一个具有静态方法的类,或者只需要在记忆实例引用上调用实例方法的常规函数。在静态类方法的情况下,您通常会提供某种“init”方法,该方法接受对您的实例的引用。您将GLUT回调设置为静态方法,静态方法又调用存储引用的方法。
在常规函数的情况下,您公开了一个“init”函数,它接受您的实例的引用并将其存储在全局变量中(通常您希望它仅对于您的函数所在的文件是全局的)。和上面的情况一样,您将GLUT回调设置为文件中的常规函数,然后在全局存储的引用上调用适当的方法。 当然,您只想将“init”函数暴露给其他代码,并保持全局变量和回调函数隐藏。
希望你理解。如果你想要代码示例,请告诉我。