过度热心的方法没有电话就能完成工作? C ++ Glut初始化变得流氓

时间:2010-08-29 12:31:46

标签: c++ initialization glut

新手C ++程序员还在这里。

我正在使用VC ++ VS2008编译器和glut库。所有工作正常和最新(我知道2010年只有cba因为XNA(C#)支持原因)

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

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

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

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

您可能在想,嘿,您已对初始代码进行了评论。 我确实。猜猜看,它仍然有效!为什么?除了烧烤之外,我真的不知道过剩了......所以... ----这可能是一个很好的点,你可以调用失败,如果有的话

我有一个使用此方法的drawcene类

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没有完成这一切都是热潮。所以唯一合乎逻辑的结论就是说这个方法被调用了,对吗?

还有很多其他方法和类,但是没有displayescene类和控制器类的实例。我可以评论包含,它会做同样的事情。

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

可能会忘记一些非常愚蠢的东西,但我宁愿找出a.s.a.p.无论如何,关于成为一个新秀的好处是,我不能不关心我的脸上掉下来并再次尝试着如此火与评论^^

非常感谢你!

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

编辑2:14:45 29/08/2010

好的,我找到了......

drawcene中的构造函数调用类的initGlut和initRendering方法。控制器创建一个指向堆的指针,其中包含drawScene对象,这会导致方法运行init代码。

然而,控制器不包含在main中,也没有实例化。那个drawScene代码在main启动之前运行,然后我可以得出结论构建本身就是问题所以我应该避免构造函数中的init代码吗?

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

发现另一个,当只有drawScene是活动的初始化代码时,才会发生双重调用。是不是每个包含drawcene都会导致构造函数代码运行init代码并导致double init?

2 个答案:

答案 0 :(得分:1)

为什么不在你的初始化代码上加一个断点然后走上调用堆栈以查看它被调用的位置?

慢慢走过去,我想你会找到源......

编辑:保持对构建器之外的库等事物的初始化是一种很好的做法。就个人而言,我只是测试在构造函数中已经初始化了过量,如果它是必需的,并且如果没有检测到则抛出异常。

答案 1 :(得分:0)

显然那些漂亮的指针不是对象的一部分,而是全局的,GG C#VS C ++:P

cpp文件中的东西的全局声明BAD,经验教训