c++ - 不打电话就工作的过分热心的方法? C++ Glut初始化变得流氓

标签 c++ initialization glut

菜鸟 C++ 程序员仍然在这里。

我正在使用 VC++ VS2008 编译器和过剩库。所有工作正常并且是最新的(由于 XNA (C#) 支持原因,我知道 2010 年只有 cba)

好的,这次我有一个与代码相关的问题,但我可以使代码正常工作。我不能做的是弄清楚引擎盖下发生了什么。这就是我想弄清楚的。

假设一切正常,因为显然在运行时它有效!

这是代码(最小化到实际运行到它的裸核以帮助加快速度)

#include "stdafx.h"
#include "Controller.h"
#include "glut.h"
#include <iostream>

void main(int argc, char** argv) 
{   
    glutInit(&argc, argv);
    //controller_ptr->InitController();  <---- no link to controller-->DrawScene

    //INIT GLUT
    //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    //glutInitWindowSize(400, 400); //Set the window size
    //glutCreateWindow("Some Program"); 

    //INIT RENDERING
    glEnable(GL_DEPTH_TEST);

    glutDisplayFunc(drawScene);
    glutKeyboardFunc(handleKeypress);
    glutReshapeFunc(handleResize);
    glutMainLoop();
}

您可能在想,嘿,您对初始化代码进行了注释。 我确实如此。你猜怎么着,它还在工作!为什么?我真的不知道除了烧烤之外的过剩,所以你.... <---- 如果有的话,这可能是你称之为失败的好点

我有一个用这个方法绘制场景的类

void DrawScene::initGlut()
{
    //Enables depth culling/front face culling??????  <----- what about that, some   depth thingy was involved is all I'm sure of
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(400, 400); //Set the window size
    glutCreateWindow("Some Program"); 
}

当我评论这个并取消注释主要的那个时,结果相同。我没有评论,过剩说 init 完成了两次,我也没有评论,init 没有完成一切都在繁荣。所以唯一合乎逻辑的结论是调用了这个方法,对吧?

周围有很多其他方法和类,但没有 displayescene 类或 Controller 类的实例。我可以评论包含,它会做同样的事情。

在 MSbuild 或 VC++ 开发中是否有一些我不理解的设计部分允许方法沿着我不知道的一些流或流程进行筛选?据我所知,如果我不创建一个类的实例,它是不相关的,至少它是非静态成员。那么这段代码在该成员中处于事件状态或不活动状态如何对我的程序产生影响呢?

可能会忘记一些非常愚蠢的事情,但我宁愿尽快找出答案。不管怎样,作为一个菜鸟的好处是我不在乎摔倒在地然后再试一次,所以不要理会评论^^

非常感谢您!

编辑:什么?现在,没有对代码进行任何更改的控制台确实报告了一次对 init 的双重调用,其中主要的 init 在注释中,而 drawscene 中的那个不在注释中......我非常困惑。

编辑 2:2010 年 8 月 29 日 14:45

好吧,我发现了一些东西......

drawscene中的构造函数调用类的initGlut和initRendering方法。 Controller 指向保存 drawScene 对象的堆,这会导致方法运行初始化代码。

然而, Controller 不包含在主 Controller 中,也没有实例化。该 drawScene 代码在主程序启动之前运行,然后我是否可以得出构建本身就是问题的结论,因此我应该避免在构造函数中使用初始化代码?

编辑 3:15:02 29/08/2010

发现另一个,当只有 drawScene 是事件的初始化代码时,确实会发生双重调用。会不会是drawscene的每次include都会导致构造函数代码运行init代码导致double init?

最佳答案

为什么不在您的初始化代码上设置一个断点,然后沿着调用堆栈向上走,看看它在哪里被调用?

慢慢浏览它,我想你会找到源头..

编辑:将诸如库之类的东西的初始化保留在构造函数之外是一种很好的做法。就我个人而言,如果需要,我只会测试是否已在构造函数中初始化过剩,如果未检测到,则抛出异常。

关于c++ - 不打电话就工作的过分热心的方法? C++ Glut初始化变得流氓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3594728/

相关文章:

c++ - 如何在openGL c++中的同一窗口中绘制两个对象?

c++ - 将临时派生对象传递给需要基础对象引用的方法/函数

c++ - find_if 错误 : invalid initialisation of reference of type 'const node&' from expression of type 'node*'

c# - 为什么 C# 局部变量应该直接赋值,即使它是默认值?

opengl - Haskell OpenGl 和 GLUT 模棱两可的发生

c++ - Ubuntu 10.10下运行OpenGL项目报错

c++ - 我怎样才能 boost::bind 到传递并返回 std::string 的托管类的成员?

c++ - 如何在另一个函数中使用一个函数指向对象的指针?

java - 在 do{} 中初始化的变量不递增

C++使用new创建带有初始化程序的对象数组