Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
192 / 141 / 63
Регистрация: 07.10.2017
Сообщений: 685
1

Как передать функцию из другого класса в функцию glutSpecialFunc() которая находится в main?

20.12.2019, 14:33. Просмотров 1285. Ответов 11


В программе которая двигает нарисованную мною фигуру в OpenGl, есть функция регистрации нажатия клавиш:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void specialKeys(int key, int xx, int yy) {//Функция регистрации специальных клавиш клавиатуры
    switch (key) {
 
    case GLUT_KEY_RIGHT:
        x += moveSpeed;
        break;
    case GLUT_KEY_LEFT:
        x -= moveSpeed;
        break;
    case GLUT_KEY_UP:
        y += moveSpeed;
        break;
    case GLUT_KEY_DOWN:
        y -= moveSpeed;
        break;
    }
    glutPostRedisplay();
}
Она передается в функцию
C++
1
glutSpecialFunc(specialKeys);
Мне нужно вынести эту функцию регистрации клавиш, в другой класс. Если я просто выношу ее в другой класс, компилятор ругается:
Ошибка C3867 "Draw::specialKeys": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
К тому же мне желательно чтобы каким то образом переменные которые объявлены в main и которые изменяются в процессе нажатия клавиш, при выносе в другой класс также изменялись в main. Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2019, 14:33
Ответы с готовыми решениями:

Как в main() создать указатель на функцию, которая находится в классе?
В этом примере как определить указатель на функцию F()? class A { public: bool F(int &a, int...

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

Передать структуру в функцию другого класса
Добрый день, при выполнении КР возник затор, необходима подсказка. Нужно создать объект класса и...

Как передать функцию в main?
Я плохо разбираюсь в функциях помогите , как запустить это в мейне? int rec_multiplication(int...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
11
6436 / 4323 / 1750
Регистрация: 07.05.2019
Сообщений: 13,199
Записей в блоге: 1
20.12.2019, 14:36 2
Цитата Сообщение от StepFather322 Посмотреть сообщение
Мне нужно вынести эту функцию регистрации клавиш, в другой класс. Если я просто выношу ее в другой класс, компилятор ругается. К тому же мне желательно чтобы каким то образом переменные которые объявлены в main и которые изменяются в процессе нажатия клавиш, при выносе в другой класс также изменялись в main. Заранее спасибо.
Что значит "вынести в другой класс", а сейчас она в каком?
0
192 / 141 / 63
Регистрация: 07.10.2017
Сообщений: 685
20.12.2019, 14:44  [ТС] 3
oleg-m1973, в main. У меня есть так сказать "главный класс" программы, в котором функция main выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitWindowSize(900, 900);   
    glutInitWindowPosition(50, 50);                 
    glutCreateWindow("Primite labu please :)"); 
    glutDisplayFunc(display); 
    glutSpecialFunc(specialKeys);//Специальные клавиши
    glutMouseFunc(mouse);//Клавиши мыши
    glutKeyboardFunc(keyboard);//Обычные клавиши
    initGL();
    glutMainLoop();
    return 0;
}
В этом же классе, но выше, определена функция specialKeys(), мне нужно вынести ее в другой класс, скажем Draw, в котором я рисую фигуру.
0
14041 / 7522 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
20.12.2019, 14:45 4
StepFather322,
Если вы так замысловато описываете свое желание сделать обработчик методом класса, то обратите внимание на функции
glutGetWindowData и glutSetWindowData
С помощью них можно прокинуть this в статическую функцию (ее и регистрировать в качестве обработчика), а внутри нее уже через проброшенный указатель вызывать метод.
0
6436 / 4323 / 1750
Регистрация: 07.05.2019
Сообщений: 13,199
Записей в блоге: 1
20.12.2019, 14:46 5
Цитата Сообщение от StepFather322 Посмотреть сообщение
oleg-m1973, в main
main - это класс?
Или тебе нужно в другой cpp-файл её перенести?
0
192 / 141 / 63
Регистрация: 07.10.2017
Сообщений: 685
20.12.2019, 14:53  [ТС] 6
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Или тебе нужно в другой cpp-файл её перенести?
Да, прошу прощения, мне нужно перенести ее в другой cpp-файл, и уже оттуда передать в качестве аргумента функции glutSpecialFunc(specialKeys) который в свою очередь находится в основном cpp - файле, в функции main;

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
С помощью них можно прокинуть this в статическую функцию (ее и регистрировать в качестве обработчика), а внутри нее уже через проброшенный указатель вызывать метод.
Звучит очень сложно для меня
0
6436 / 4323 / 1750
Регистрация: 07.05.2019
Сообщений: 13,199
Записей в блоге: 1
20.12.2019, 14:54 7
Цитата Сообщение от StepFather322 Посмотреть сообщение
Да, прошу прощения, мне нужно перенести ее в другой cpp-файл, и уже оттуда передать в качестве аргумента функции glutSpecialFunc(specialKeys);
Тогда там, где ты вызываешь glutSpecialFunc оставь декларацию этой функции -
C++
1
void specialKeys(int key, int xx, int yy);
А саму функцию перенеси куда хочешь
1
14041 / 7522 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
20.12.2019, 14:58 8
Лучший ответ Сообщение было отмечено StepFather322 как решение

Решение

Цитата Сообщение от StepFather322 Посмотреть сообщение
Звучит очень сложно для меня
Давайте начнем с вещей попроще.
Цитата Сообщение от StepFather322 Посмотреть сообщение
"Draw::specialKeys": нестандартный синтаксис; используйте "&", чтобы создать указатель на член
Эта ошибка говорит о том, что вы сделали функцию specialKeys нестатическим членом класса (методом). Самый главный вопрос - зачем? Если у вас есть веское основание для этого, то описанный ваше "сложный" способ практически единственный вариант это поддержать (исключая использование глобальных переменных). Если же вам на самом деле не нужна эта функция в качестве метода, то все просто - не делайте ее методом и все.
0
192 / 141 / 63
Регистрация: 07.10.2017
Сообщений: 685
20.12.2019, 15:03  [ТС] 9
Цитата Сообщение от DrOffset Посмотреть сообщение
Эта ошибка говорит о том, что вы сделали функцию specialKeys нестатическим членом класса (методом)
После того как я сделал ее статической, все заработало как нужно. Мне не важно статическая она, или нет. Мне нужно было лишь вынести ее в отдельный cpp-файл(ну или класс, как угодно).
Осталось придумать как реализовать изменение переменных в главном файле, при их изменении в этой функции
Спасибо
0
14041 / 7522 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
20.12.2019, 15:12 10
Цитата Сообщение от StepFather322 Посмотреть сообщение
Осталось придумать как реализовать изменение переменных в главном файле, при их изменении в этой функции
А раньше у вас как было сделано?
0
192 / 141 / 63
Регистрация: 07.10.2017
Сообщений: 685
20.12.2019, 15:20  [ТС] 11
Цитата Сообщение от DrOffset Посмотреть сообщение
А раньше у вас как было сделано?
Раньше у меня были глобальные переменные x,y и они просто изменялись в этой функции, так как все было в 1 файле.
0
14041 / 7522 / 1781
Регистрация: 30.01.2014
Сообщений: 12,580
20.12.2019, 15:44 12
Цитата Сообщение от StepFather322 Посмотреть сообщение
Раньше у меня были глобальные переменные x,y и они просто изменялись в этой функции, так как все было в 1 файле.
Ну если вас это решенеи устраивало, то сейчас вам надо объявить их как extern в вашем другом cpp и все будет работать как раньше.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2019, 15:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как передать вектор из main() во внутреннюю функцию ?
Нужно передать вектор из main в функцию gen_binar_sq , записать в него элементы, и получить в...

Передать аргумент argv не в main функцию как глобал
Здравствуйте!Мне нужно получить аргументы командной строки не для main() функции,передать вектор...

Передать Image в функцию другого класса
Добрый день, помогите пожалуйста. Есть форма на форме компонент Image в который загружаю картинку ...

Как передать функцию из класса в другую функцию (в качестве параметра)?
У меня есть такой класс: Class a{ static public function sum($a, $b) { return $a+$b; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.