4

我在使用过剩 DisplayFunction 中的对象时遇到问题。

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();
};

建模.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 ();
}

过剩显示函数(显示函数);glutIdleFunc(DisplayFunction);

这行不通。我知道我可以将 DisplayFunction 声明为静态成员,但这不允许我使用 Cam 对象,知道吗?

谢谢 !!!

4

3 回答 3

0

static在 C++ 中,还必须声明方法使用的数据成员和方法static。最简单的方法是声明Camstatic.

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

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

(请注意,根据其他Cam使用方式,您可能会面临静态初始化惨败。)

于 2011-04-18T21:47:18.533 回答
0

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

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();
};

它会起作用

于 2011-04-18T22:07:02.213 回答
0

您要做的基本上是使用非静态成员函数作为 C 回调,这是 C++ 荒谬的难点之一。

这个 StackOverflow 问题和要解决的示例中给出了为什么这在 C++03 中不容易工作的一个很好的概述。

于 2011-04-18T22:42:20.863 回答