Форум программистов, компьютерный форум CyberForum.ru

[C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
15.10.2012, 01:05     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #1
Пишу программу для обхода бинаронго дерева поиска.
Программа написана и кажется даже работает, но только в консоли.
Решил выводить дерево на экран, для наглядности, используя OpenGL (как раз его в это время начал изучать).
Но тут появилась проблема, оказывается нельзя передать метод класса как параметр функции glutDisplayFunc();
Пытался что-то найти в интернете, но большого успеха этого не дало.
Примерная схема(что к чему, так сказать :-))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class SET //элемент дерева
{
     //какие-то поля - для нас значения не имеют
};
 
class TREE //класс дерева
{
     private:
         SET *root; //корень
         SET *now; //текущий элемент
         SET *prev; //предыдущий элемент
     private:
         TREE() {};
         ~TREE() {};
         void Input();  //ввод дерева
         void Output();//вывод дерева
} binary;
 
void TREE::Input()
{
//код функции
}
void TREE::Output()
{
//код функции
}
 
int main(int argc, char **argv)
{
     //часть кода
     glutDisplayFunc(binary.Output()); //как оказалось, так нельзя
     //часть кода
}
Где-то мельком видел, что надо объявлять переменные и функции как static, но тогда, насколько я знаю надо всю функцию писать при объявлении ее в классе(можно ли это обойти?)? исправьте, если ошибаюсь )

Что можете посоветовать по данной проблеме?

Заранее всем спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2012, 01:05     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
Посмотрите здесь:

Функции, передача массива в качестве параметра C++
Передача двумерного массива указателей на char в качестве параметра функции C++
C++ Передача метода класса в качестве параметра для метода другого класса
C++ двумерный массив в качестве параметра метода класса
C++ Передача enum в качестве аргумента метода класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
15.10.2012, 01:30     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #2
Добавлено через 16 минут
Static функция передается без проблем. А методу класса передается также скрытый параметр this.
Сейчас попробую что-нибудь нашаманить.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.10.2012, 01:33     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #3
Kirill Losev, std::function/std::bind или boost::function/boost::bind

glutDisplayFunc(std::bind(&TREE::Output, binary));
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
15.10.2012, 01:51  [ТС]     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #4
Croessmah, спасибо, жду

Добавлено через 1 минуту
I.M., а поподробнее можете рассказать что это и с чем использовать? )

Добавлено через 3 минуты
Цитата Сообщение от I.M. Посмотреть сообщение
glutDisplayFunc(std::bind(&TREE::Output, binary));
I.M., спасибо. сейчас опробую

Добавлено через 13 минут
Цитата Сообщение от I.M. Посмотреть сообщение
std::function/std::bind или boost::function/boost::bind
I.M., а нужно ли подключать какую-нибудь дополнительную библиотеку?
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.10.2012, 02:15     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #5
да.
bind
или
boost/bind
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.10.2012, 08:49     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #6
Добавлено через 13 минут
glut функциям нужны указатели на свободные функции.
а то, что возвращается функцией std::bind или std::function - вот они не умеют преобразовываться в указатели на свободные функции. итого: просто так у вас это не получится сделать.
вот тут похожие рассуждения и закончилось все тем, что автора устрола самодельная штука:
bind
самое простое - это сделать глобальный объект или синглтон. примерно такая схема:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
App* g_app;
 
void onDisplay()
{
  g_app->onDisplay();
}
 
int main()
{
  std::auto_ptr<App> app(new App());
  g_app = app.get();
 
  ...
  glutDisplayFunc(&onDisplay);
  ...
  
}
ну и все самое полезное делать уже в методах App::...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 10:32     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
Еще ссылки по теме:

Передача функции с двумерным массивов в качестве параметра C++
C++ Передача члена класса в качестве параметра метода
Передача класса в качестве параметра шаблона C++

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

Или воспользуйтесь поиском по форуму:
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
15.10.2012, 10:32  [ТС]     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc() #7
DU, спасибо. сегодня попробую. о результатах отпишусь
Yandex
Объявления
15.10.2012, 10:32     [C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
Ответ Создать тему

Метки
glut, opengl, класса, метод, параметр
Опции темы

Текущее время: 17:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru