【问题标题】:Using Objects into a Glut Display Function在 Glut 显示函数中使用对象
【发布时间】:2011-04-18 21:27:34
【问题描述】:

我在使用过剩 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 ();
}

glutDisplayFunc(DisplayFunction); glutIdleFunc(DisplayFunction);

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

谢谢!!!

【问题讨论】:

    标签: c++ glut freeglut


    【解决方案1】:

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

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

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

    (请注意,根据Cam 的其他使用方式,您可能会对static initialization fiasco 敞开心扉。)

    【讨论】:

    • 我很抱歉问这个问题,但是我如何在头文件中声明一个静态对象 Cam ?
    • 您在头文件中将其声明为static Camera* Cam;。
    • 对不起,我犯了一个错误,这很好用。当我在这个论坛上提问时,我总是得到完美的答案。谢谢!!
    • 太棒了!如果您对答案感到满意,则可以将其标记为“已接受”,让所有人都知道。回答的人也会获得声望积分。 :)
    【解决方案2】:

    您不能这样做,因为您的 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();
    };
    

    它会起作用的

    【讨论】:

    • 谢谢,但这不起作用,因为我的对象凸轮不是静态的。
    • 您必须将函数指针传递给 glutDisplayFunc - 无法绕过它
    【解决方案3】:

    您要做的实际上是使用非静态成员函数作为 C 回调,这是 C++ 中可笑的难点之一。

    this StackOverflow question 中给出了一个很好的概述为什么这在 C++03 中不能轻松工作,并提供了一些解决示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2021-11-09
      • 2019-01-22
      • 1970-01-01
      • 2013-02-06
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多