在我的主文件中全局创建c++类实例
Creating C++ class instances globally within my main file
我有一个程序与一些类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;
相关文章:
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 在std::vector上存储带有模板的类实例
- 为什么创建友元类的实例会导致"undefined reference to"错误?