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

C++ 创建C++;在我的主文件中全局地类实例,c++,class,C++,Class,我有一个带有OpenGL类的程序,例如窗口、程序等 我希望我在主文件中使用的窗口和程序类的实例对于主文件是全局的,我已经用这样的窗口做了一段时间了 //Outside main() Window window ( "test", //title 1366, //width 768, //height ); 然后我可以在主文件的其余部分使用这个实例 //Within main() window.create(); window.refres

我有一个带有OpenGL类的程序,例如窗口、程序等

我希望我在主文件中使用的窗口和程序类的实例对于主文件是全局的,我已经用这样的窗口做了一段时间了

//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");
Program 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");
Program program();
我得到一个错误:

request for member 'addShader' in 'program', which is of non-class type 'Program()'
仔细研究后,编译器似乎认为我在main()之前初始化的实例是一个函数,因此它认为我试图调用一个显然不起作用的函数的方法

我只是不知道如何使它以Windows的方式工作,我能分辨出的可能意味着Windows工作和程序不工作的关键区别是:

  • 窗口的构造函数有参数,而程序没有
  • 在main()中,除了这个全局类之外,我还有其他的程序类实例,当然它们有不同的名称,但这可能会导致一些问题
使用

Program program;
而不是

Program program(); 

对于没有参数的构造函数,不需要使用参数。实际上,第二个构造被解释为函数声明(函数不返回参数
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");
Program program();
因为解析器认为您刚刚声明了一个名为“program”的函数,该函数没有参数,返回程序实例

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

Program program;

你已经发现了所谓的

事实上,当你这样做时:

Program program();
这是不明确的,因为你可能在做两件事:

  • 创建不带参数的变量
    程序
  • 声明一个名为
    program
    的函数,该函数返回一个
    program
    且不带参数
<>和C++标准规定,当编译器遇到此代码时,选择第二种可能性。

为了避免这个问题,只需删除paren

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

Program()
是一个函数声明。Duplicates:Related:编译器将其解释为函数声明(只是一个精度,因为这是可接受的答案)。