在过剩的显示功能中使用对象

发布于 2024-11-02 00:45:30 字数 1160 浏览 2 评论 0原文

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

Modelization.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 声明为静态成员,但这不允许我使用 Cam 对象,知道吗?

谢谢 !!!

i'm having trouble using an object in a glut 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();
};

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

This doesn't work.
I know that i can declare DisplayFunction as a static member, but this won't allow me to use the Cam Object, any idea ?

Thx !!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情绪失控 2024-11-09 00:45:30

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

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

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

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

In C++, data members and methods that a static method uses must also be declared static. The easiest way out of this is to declare Cam to be static.

You'll also have to initialize it statically, that is, in your implementation file:

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

(Note that, depending on how else Cam is used, you might open yourself up to the static initialization fiasco.)

枉心 2024-11-09 00:45:30

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

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

它会起作用

You can not do that, because your void DisplayFunction (); is not static, and glutDisplayFunc expects a function pointer. Change your Modelisation class to this :

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

and it will work

英雄似剑 2024-11-09 00:45:30

您想要做的本质上是使用非静态成员函数作为 C 回调,这是 C++ 中最荒谬的困难部分之一。

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

What you are trying to do is essentially to use a non-static member function as a C callback, which is one of the ridiculous hard parts of C++.

A good overview why this doesn't work easily in C++03 is given in this StackOverflow question and examples to work around.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文