在我的主文件中全局创建C ++类实例

时间:2014-08-01 09:41:11

标签: c++ class

我有一个包含OpenGL内容的程序,例如窗口,程序等。

我希望我在主文件中使用的Window和Program类的实例对于主文件是全局的,我一直在使用Window这样做

//Outside main()
Window window
(
    "test",    //title
    1366,      //width
    768,       //height
);

然后我可以在主文件的其余部分使用此实例,例如。

//Within main()

window.create();

window.refresh();

现在,当我尝试制作程序的全局实例时,我会这样做:

//Just below Window, still outside main()
Program program();    //No arguments for the constructor for Program

然后当我尝试在我的主函数中使用它时:

program.addShader(GL_VERTEX_SHADER, "vertex_shader_source.glsl");

我收到错误:

request for member 'addShader' in 'program', which is of non-class type 'Program()'

看了这个,看起来编译器认为我在main()之前初始化实例是一个函数,所以它认为我试图在一个显然不起作用的函数上调用方法。

我只是无法弄清楚如何以对Window的方式来完成这项工作,我可以告诉的关键区别可能意味着Window工作而程序不是:

  • Window的构造函数有参数,而Program没有。
  • 除了这个全局版本之外,我在main()中有其他Program类的实例,当然它们有不同的名称,但它仍然可能会导致一些问题吗?

3 个答案:

答案 0 :(得分:2)

您已经发现了所谓的most vexing parse

确实,当你这样做时:

Program program();

它含糊不清,因为你可以做两件事:

  • 创建一个ctor不带参数的变量program
  • 声明一个名为program的函数,它返回Program并且不带参数

C ++标准规定编译器在遇到此代码时会选择第二种可能性。

要避免此问题,请删除parens

//Declares and defines a new program variable by invoking the default ctor
Program program;

答案 1 :(得分:0)

使用

Program program;

而不是

Program program(); 

如果没有参数,您不需要使用parens作为构造函数。实际上,第二个构造被解释为函数声明(函数没有参数返回Program)。

答案 2 :(得分:0)

不要这样写:

Program program();

因为解析器认为你刚刚声明了一个名为" program"没有参数,返回Program实例。

这是使用默认构造函数定义对象的正确方法:

Program program;