将对象用于Glut显示功能

时间:2011-04-18 21:27:35

标签: c++ glut freeglut

我在使用过量显示功能中的对象时遇到问题。

class Modelisation
{
private:
    int hauteur, largeur, x, y;
    Camera *Cam;

    void DisplayFunction ();
    static void RedisplayFunction (int, int);

public:
    Modelisation (int argc, char **argv, char[]);
    ~Modelisation ();

    void StartMainLoop();
};

Modelisation.cpp

Modelisation::Modelisation (int argc, char **argv, char windowName [])
{
    Cam = new Camera;
    glutInit (&argc, argv);
    glutInitDisplayMode (GLUT_SINGLE);
    glutCreateWindow (windowName);
};
void Modelisation::StartMainLoop()
{
    glutDisplayFunc(DisplayFunction);
    glutIdleFunc(DisplayFunction);
    glutReshapeFunc(RedisplayFunction);
    glutMainLoop(); 
}
void Modelisation::DisplayFunction()
{
    glClearDepth (1);
    glClearColor (0.0f, 0.0f, 0.0f, 0.0f); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
    glLoadIdentity ();
    Cam->Render ();
    glFlush ();
    glutSwapBuffers ();
}

glutDisplayFunc(DisplayFunction); glutIdleFunc(DisplayFunction);

这不起作用。 我知道我可以将DisplayFunction声明为静态成员,但这不允许我使用Cam对象,任何想法?

Thx !!!

3 个答案:

答案 0 :(得分:0)

在C ++中,static方法使用的数据成员和方法也必须声明为static。最简单的方法是将Cam声明为static

您还必须静态初始化它,即在您的实现文件中:

Modelisation::Camera* Cam = new Camera();

(请注意,根据Cam的使用方式,您可能会打开static initialization fiasco

答案 1 :(得分:0)

你不能这样做,因为你的void DisplayFunction ();不是静态的,而glutDisplayFunc需要一个函数指针。将您的Modelisation类更改为:

class Modelisation
{
private:
    int hauteur, largeur, x, y;
    Camera *Cam;

    static void DisplayFunction ();
    static void RedisplayFunction (int, int);

public:
    Modelisation (int argc, char **argv, char[]);
    ~Modelisation ();

    void StartMainLoop();
};

它会起作用

答案 2 :(得分:0)

你要做的主要是使用非静态成员函数作为C回调,这是C ++的一个荒谬的难点部分。

很好地概述了为什么这在C ++ 03中不起作用的原因在this StackOverflow question和示例中给出了解决方法。