Класс C++ и 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 или метод on при рисовании, потому что у него нет экземпляра.

Есть ли решение? Я делаю так, потому что мне нужно несколько переменных во многих методах, и лучшим способом было бы создать экземпляр этого класса в главной функции и во всех методах внутри этого класса. Я делаю то, что не должен делать?

Извините, если решение простое, я новичок в C++ и никогда не использовал класс таким образом, это первый раз.

1 ответ

Решение, которое я сейчас использую, включает в себя глобальную оболочку для методов экземпляра.

Вам нужен класс со статическими методами или просто обычные функции, которые вызывают методы экземпляра по запомненной ссылке на экземпляр. В случае статических методов класса вы обычно предоставляете какой-то метод "init", который принимает ссылку на ваш экземпляр. Вы устанавливаете обратные вызовы GLUT для статических методов, которые, в свою очередь, вызывают методы по сохраненной ссылке.

В случае обычных функций вы предоставляете функцию "init", которая берет ссылку на ваш экземпляр и сохраняет ее в глобальной переменной (обычно вы хотите, чтобы она была глобальной только для файла, в котором находятся ваши функции). И, как в случае выше, вы устанавливаете обратные вызовы GLUT для ваших обычных функций в файле, которые затем вызывают соответствующие методы для вашей глобальной сохраненной ссылки. Конечно, вам нужно только представить функцию "init" другому коду и оставить скрытыми глобальные переменные и функции обратного вызова.

Надеюсь, вы поняли. Скажите, хотите ли вы пример кода?

Другие вопросы по тегам