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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
#1

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

15.10.2012, 01:05. Просмотров 2700. Ответов 6

Пишу программу для обхода бинаронго дерева поиска.
Программа написана и кажется даже работает, но только в консоли.
Решил выводить дерево на экран, для наглядности, используя 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++):

Передача метода класса в качестве параметра для метода другого класса - C++
Здравствуйте, Передо мной стоит такая задача. Необходимо разработать механизм, который бы мог прервать любую функцию, при этом абсолютна...

Передача члена класса в качестве параметра метода - C++
Добрый день. Интересует следующий вопрос: как передать член класса как параметр по значению в метод того же класса? То есть необходимо,...

Передача метода класса в качестве аргумента внешней функции - C++
Столкнулся со следующей проблемой. Пусть у меня есть некая внешняя функция, которая принимает в качестве аргумента указатель на функцию...

двумерный массив в качестве параметра метода класса - C++
Добрый день Есть проблемка, попробую упростить условия по максимуму: В программе меется некоторый класс, у этого класса есть метод,...

Указатель на объект в качестве параметра вызываемого метода класса - C++
Код по сути //Interface.cpp #include "Interface.h" void Interface::input() { Teplitsa *kaka; kaka = new Teplitsa; ...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13147 / 7410 / 830
Регистрация: 27.09.2012
Сообщений: 18,243
Записей в блоге: 3
Завершенные тесты: 1
15.10.2012, 01:30 #2
Добавлено через 16 минут
Static функция передается без проблем. А методу класса передается также скрытый параметр this.
Сейчас попробую что-нибудь нашаманить.
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.10.2012, 01:33 #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  [ТС] #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.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
15.10.2012, 02:15 #5
да.
bind
или
boost/bind
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.10.2012, 08:49 #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::...
Kirill Losev
3 / 3 / 0
Регистрация: 01.10.2011
Сообщений: 249
15.10.2012, 10:32  [ТС] #7
DU, спасибо. сегодня попробую. о результатах отпишусь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 10:32
Привет! Вот еще темы с ответами:

Передача enum в качестве аргумента метода класса - C++
Есть класс //class order; class ticket{ enum type_of_place { coupe, general, berth, wagon_lit }_type_of_place; char*...

Передача функции в качестве параметра - C++
Как передать функцию с параметрами в transform? Т.е., например, мне надо из каждого числа вектора вычесть число k с помощью transform'а,...

Передача CString в качестве параметра функции - C++
Добрый всем вечер! Мучает один вопрос, на который не могу найти ответ. Как наилучшим образом передавать объект класса CString в...

Функции, передача массива в качестве параметра - C++
Приветствую) Собственно, есть простенькое задание с двумерными массивами, оно выполнено: #include &lt;iostream.h&gt; #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.10.2012, 10:32
Ответ Создать тему
Опции темы

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