C ++类和freeglut(参数类型不匹配)

时间:2014-02-14 18:57:42

标签: c++ class types match freeglut

我想创建一个类来保存我的变量,许多函数将使用它们,如鼠标位置和其他东西。这就是我所做的:

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 ++的新手,从未使用过这种方式,这是第一次。

1 个答案:

答案 0 :(得分:0)

我目前使用的解决方案涉及实例方法的全局包装。

您需要一个具有静态方法的类,或者只需要在记忆实例引用上调用实例方法的常规函数​​。在静态类方法的情况下,您通常会提供某种“init”方法,该方法接受对您的实例的引用。您将GLUT回调设置为静态方法,静态方法又调用存储引用的方法。

在常规函数的情况下,您公开了一个“init”函数,它接受您的实例的引用并将其存储在全局变量中(通常您希望它仅对于您的函数所在的文件是全局的)。和上面的情况一样,您将GLUT回调设置为文件中的常规函数​​,然后在全局存储的引用上调用适当的方法。 当然,您只想将“init”函数暴露给其他代码,并保持全局变量和回调函数隐藏。

希望你理解。如果你想要代码示例,请告诉我。