Класс 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" другому коду и оставить скрытыми глобальные переменные и функции обратного вызова.
Надеюсь, вы поняли. Скажите, хотите ли вы пример кода?