所以我正在编写一个程序,它有一个叫做oglapp的大类,还有一大堆使用它的其他类。我想要实现的是在我的所有.cpps中拥有一个超级全局的oglapp *。我的方法是在main.cpp中声明一个oglapp *,它有入口点(设置指针并开始运行类),并且我在oglapp的头文件的末尾有一个extern引用。理论上,如果我在项目的任何地方使用oglapp类,我需要包含它的标题,其中包括extern,而且我很好。这就是我所拥有的:
//main.cpp
oglapp* app;
entrypoint(){app=new oglapp(); app->run();}
//oglapp.h
class oglapp { ... }; extern oglapp* app;
//classX.h
#include "oglapp.h"
classX { ... };
//classX.cpp
#include "classX.h"
void classX::somefunction(){app->dosomething();}
我得到的是一个大的空引用错误。我尝试在classX的.cpp中包含oglapp标题,也尝试使用extern oglapp * app;对于每个classXs,我尝试了一切我能想到的。另外,奇怪的是,我并没有在所有classX中得到空引用错误。他们中的一些人可以毫无问题地使用应用程序,其中一些人将其视为空指针。我还没有发现是什么决定它是否起作用。
我做错了什么?另外,如果不可能以这种方式声明一个类的超级全局指针,我应该怎么做呢?
答案 0 :(得分:2)
对于从main
内部实例化的任何内容或main
调用的任何内容,它都能可靠地工作。对于全局范围内的对象,这些对象在运行main
之前构造,因此您的指针尚未设置。
您可以在调用堆栈的main
或更高位置内对所有内容进行初始化,也可以创建oglapp
单例。
或者,因为看起来oglapp
不接受任何构造函数的参数,你可以extern
一个实际的实例并在全局范围内创建一个那些,而不是一个指针。然后你必须警惕静态初始化命令fiasco (查找它!),但至少你的其他全局对象将有机会 ...如果你小心
答案 1 :(得分:0)
由于您尚未发布所有代码,因此很难确定问题所在。但是,您可以通过使oglapp
成为单例来避免空引用问题。有关详细信息,请参阅http://en.wikipedia.org/wiki/Singleton_pattern。
答案 2 :(得分:0)
static *oglapp _instance = NULL;
*oglapp oglapp_factory()
{
if (_instance == NULL) _instance = new oglapp();
return _instance;
}
你的“extern”文件声明了类定义和(外部存在......)“oglapp_factory()”。任何需要与类的(唯一)实例交互的例程都会调用工厂例程来获取它。