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

Creating C++ class instances globally within my main file

本文关键字:c++ 实例 创建 全局 我的 主文件      更新时间:2023-10-16

我有一个程序与一些类OpenGL的东西,如窗口,程序等。

我希望我在主文件中使用的Window和Program类的实例在主文件中是全局的,我已经在windows中这样做了一段时间了

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

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

//Within main()
window.create();
window.refresh();

等。

现在,当我尝试创建Program的全局实例时,我这样做:

//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的构造函数有参数,而Program没有。
  • 我有其他实例的程序类在main()除了这个全局的一个,当然他们有不同的名称,但仍然可能会导致一些问题?

您已经发现了所谓的最令人烦恼的解析

确实,当你这样做的时候:

Program program();

是有歧义的,因为你可以做两件事:

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

c++标准要求编译器在遇到这段代码时选择第二种可能性。

要避免这个问题,只需去掉父

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

使用

Program program;
不是

Program program(); 

不需要对不带参数的构造函数使用parent。实际上,第二个结构被解释为函数声明(函数没有参数返回Program)。

不要这样写:

Program program();

,因为解析器认为您只是声明了一个名为"program"的函数,没有参数,返回program实例。

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

Program program;