LINUX.ORG.RU

Связь функции внутри класса с внешним миром.


0

0

void draw(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Function of clear window
int k = 3;
///// Plase code here //////

///////////////////////////////////////////
glutSwapBuffers();
}

int K3DDesktop::initOGL(int argc, char* argv[])
{
glutInit(&argc, argv);

glutInitWindowSize(800, 800); //Position and
glutInitWindowPosition(10, 10); // size of window
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE ); //Mode of MainWindow
glutCreateWindow("########################"); //Create window with Caption
Init();

glutReshapeFunc(resize); //Function for reshape
glutDisplayFunc(draw); //Function for resize
return 1;
}

Необходимо в draw передать массив координат формируемый в классе K3DDesktop и количество элементов в масиве, просто написать:

void draw(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Function of clear window
int k = 3;
///// Plase code here //////
while(n)
{
icons[n].draw();
}
///////////////////////////////////////////
glutSwapBuffers();
}

нельзя, он и должно быть так - говорит что не определены n и icons.
Также невозможно сделать draw и resize членами класса, тогда они не будут видны для фунций gl'я:

glutReshapeFunc(resize); //Function for reshape
glutDisplayFunc(draw); //Function for resize

КАК?! это осуществить, если можно покажите на приведённых функциях.

Заранее спасибо!!!

★★★★★

Можно сделать указатель на массив и переменную содержащюю его размер глобальными - просто!, но добавлять глобальные переменные - не есть хорошо...

Есть другой вариант: из функции draw() вызывать функцию-член класса, для уменьшения накладных потерь процессорного времени сделать ее inline. Правда при этом указатель на обьект надо делать глобальным...

Думаю без ввода чего-либо глобального не обойтись.

zhuk
()

На сколько я знаю указатель на функцию draw() передается в glMainLoop().

Возможно я ошибаюсь, но указатель на ф-ю член класса - не просто указатель типа:

void (*pointer)(void),

там еще замешан механизм таблиц виртуальных методов, получится что-то типа:

void SomeClass::(*pointer)(void)

так что не получится передать в glMainLoop() указатель на метод класса. :-(

zhuk
()
Ответ на: комментарий от zhuk

Все прокатит если функцию-член сделать статической. Тогда будет достаточно указать ее полное имя в виде Class::Method

Flogger_d
()
Ответ на: комментарий от cyclon

Создаеш класс-наследник от K3DDesktop, обьявляешь в ней статический метод:
class MyClass : public K3DDesktop
{
    static void my_draw();
};

потом передаешь на нее указатель в glMainLoop() или куда там еще надо так: 
pointer/*типа указатель на ф-ю*/ = MyClass::my_draw;

но на статические методы класса есть какие-то ограничения, не помню какие...

zhuk
()
Ответ на: комментарий от zhuk

Статические функции-члены отличаются от обычных тем,
что при вызове им не передается указатель на структуру объекта (this).
Из чего следует, что такие функции могут работать только со
статическими полями. С другой стороны такая особенность позволяет
дернуть статическую функцию даже если ни одного экземпляра класса не
создано. В данном конкретном случае человек хочет просто избавиться от
глобальных ресурсов. Один вариант - сделать их статическими членами
некоего класса. Другой вариант - может быть даже более предпочтительный -
использовать пространства имен. Предпочтительной он потому, что задача
инкапсуляции решается наиболее естественным способом. При этом не
используются ненужные здесь фичи классов т.к. нет ни наследования
ни множества объектов. Так что ИМХО
namespace Tratata{
}; - здесь даже лучший вариант

Flogger_d
()
Ответ на: комментарий от Flogger_d

Flogger_d Спасибо конечно за совет с nmaespace'ом, но тут встала другая проблема

Вот мой хидер:

namespace K3DD
{
static K3DDIcons* icons;
static K3DDesk desktop;
static int num_of_icons;

void resize(int width,int height);
void draw(void);

class K3DDesktop
{
private:

int get_num_icons(int file);
void setcur(int file, int pos);
void skip(int file, char up_to_symbol, int rep);
void readicons(int file, int count);
void initOGL(int argc, char* argv[]);
void Init(void);

public:

K3DDesktop();
~K3DDesktop();
void readConfig(char* path); //read file of configuration
void readDesktopFile(char* path); //read property of KDE's icons
void run(int argc, char* argv[]);
};
}

А вот функции в которых проблема:

void draw(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //Function of clear window
////////// Plase code here /////////
int n = 0;
while(n < num_of_icons)
{
cout << "zzz" << "\n";
icons[n].draw(1);
n++;
}
///////////////////////////////////////////
glutSwapBuffers();
}

void K3DDesktop::initOGL(int argc, char* argv[])
{
glutInit(&argc, argv);

glutInitWindowSize(800, 800); //Position and
glutInitWindowPosition(10, 10); // size of window
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE ); //Mode of MainWindow
glutCreateWindow(" Created by Cyclon () "); //Create window with Caption
Init();

glutReshapeFunc(resize); //Function for reshape
glutDisplayFunc(draw); //Function for resize
}

Ну так вот, функция draw не вызывается - это явно видно потому что строки zzz не печатаются, и окно ГЛ не появляется, при этом никакой ругани компилятора на что то нет. Т.е. вроде синтаксически верно, но не работает. Може тподскажеш что делать. И ещё не будет ли проблем в строке

icons[n].draw(1);

т.е. будет ли видна эта функция, а то что то она вызывает у меня опасение.

Заранее спасибо!!!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

void K3DDesktop::run(int argc, char* argv[])
{
readDesktopFile("/home/alexandr/Desktop/.directory");
readConfig("/home/alexandr/.k3dd/k3dd-conf");
initOGL(argc,argv);
glutMainLoop();
}

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Всё оказывается гараздо интереснее. initOGL вооще не вызывается, т.е. если я правильно понял то невызываются вообще ничего, кроме run и то я run вызываю из
main:

K3DDesktop *app;
app -> run(argc, argv);

а внутри класса не вызываются.
Что делать?!

cyclon ★★★★★
() автор топика
Ответ на: комментарий от cyclon

Ну, как вариант:
- num_of_icons - неправильно инициализирована, поэтому цикл
не вертится и разу
- может быть еще где... Да и размер окна 10х10 тоже прикольно...
Может его просто не заметно на экране?
В общем, можно добавить -g при компиляции и гонять под отладчиком.
Так сразу сказать, чего у тебя там неправильно - не могу.

Flogger_d
()
Ответ на: комментарий от Flogger_d

Ну я это делаю в KDevelop, поэтому сразу видно выполнился цикл или нет, соответственно окно не появляется это сто процентов. Тут даже дело не в цикле а в чем то другом поскольку я даже не попадаю в функцию initOGL а как следствие и в draw. А num_of_icons инициализирована правильно, это проврятеся cout << num_of_icons. А попадание в функцию проверяю аналогичным образом, ставлю cout << "test" в каждой функции, ну так вот он ничего не печатается, хотя вызов стоит.

cyclon ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.