Поскольку draw
является нестатической функцией-членом, ему нужен экземпляр класса для работы.
В чистом C++ вы должны использовать функциональный объект (функтор «a.k.a.», см. std::function
или его предшественник boost::function
). Это, к сожалению, не вариант в C или C API.
В этом случае, поскольку нет данных, переданных обратному вызову, вы должны сделать какую-то статическую функцию (либо статический статический, либо статический файл), который делает правильную вещь при ее вызове.
Если вы только когда-либо один Mesh
, то это легко: либо сделать все, что в классе статического (в этом случае это в основном пространстве имен), или иметь функцию, не являющийся членом, который вызывает draw
против одного экземпляра вашей Mesh
:
// at some global-ish file scope...
// we define our class
class Mesh { ... };
// and here's the one global instance of it
Mesh myOneMesh;
// and here is our global/static function that "knows"
// which instance to draw
void drawMyOneMesh() { myOneMesh.draw(); }
// then, in the main flow of your program:
glutDisplayFunc(&drawMyOneMesh);
Если у вас есть несколько мешей, похоже, лучшее, что вы можете сделать, это ввести его в текущем окне. Не зная многое о вашем приложении или о GLUT API, я бы, вероятно, сделать что-то вроде этого, чтобы позволить меш-в-окна обратного вызова:
#include <map>
// this could also be a class with all-static members, if one
// were so inclined. might be worth it, if only to protect 'map'
// from external meddling.
namespace WindowToMesh
{
typedef std::map< int, Mesh * > Map;
Map map;
void addMapping(int win, Mesh * mesh)
{
map.insert({ win, mesh });
}
void removeMapping(int win)
{
map.erase(win);
}
void draw()
{
int win = glutGetWindow();
Map::iterator it = map.find(win);
if (it != map.end())
it.second->draw();
}
} // end namespace WindowToMesh
Теперь, в основной программе, вы можете связать новый Mesh
с текущее окно:
Mesh * m = new Mesh(...);
WindowToMesh::addMapping(glutGetWindow(), m);
И вы можете связать (статический) эффективно WindowToMesh::draw
функцию обратного вызова:
glutDisplayFunc(&WindowToMesh::draw);
Когда вы будете готовы уничтожить Mesh
, убедитесь, что вы находитесь в том же окне, а затем:
WindowToMesh::removeMapping(glutGetWindow());
В зависимости от других факторов, это может иметь смысл сделать двунаправленное отображение (так что вы можете найти вещи по Mesh *
, а не только по окну int
, или для сканирования грубой силы при редкой регистрации и т. д.
У меня нет среды, в которой я могу проверить это, но он должен быть близок. Удачи!
Посмотрите на указатели функций-членов. – Pubby
'glutDisplayFunc' ожидает указатель на свободную функцию без параметров и ничего не возвращает. Вы не можете передать ему указатель на функцию-член. – jrok
Можете ли вы написать декларацию glutDisplayFunc()? – shubendrak