C ++ extern指针

时间:2015-04-21 17:35:35

标签: c++ pointers global extern

所以我正在编写一个程序,它有一个叫做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中得到空引用错误。他们中的一些人可以毫无问题地使用应用程序,其中一些人将其视为空指针。我还没有发现是什么决定它是否起作用。

我做错了什么?另外,如果不可能以这种方式声明一个类的超级全局指针,我应该怎么做呢?

3 个答案:

答案 0 :(得分:2)

对于从main内部实例化的任何内容或main调用的任何内容,它都能可靠地工作。对于全局范围内的对象,这些对象在运行main之前构造,因此您的指针尚未设置。

您可以在调用堆栈的main或更高位置内对所有内容进行初始化,也可以创建oglapp单例。

或者,因为看起来oglapp不接受任何构造函数的参数,你可以extern一个实际的实例并在全局范围内创建一个那些,而不是一个指针。然后你必须警惕静态初始化命令fiasco (查找它!),但至少你的其他全局对象将有机会 ...如果你小心

答案 1 :(得分:0)

由于您尚未发布所有代码,因此很难确定问题所在。但是,您可以通过使oglapp成为单例来避免空引用问题。有关详细信息,请参阅http://en.wikipedia.org/wiki/Singleton_pattern

答案 2 :(得分:0)

“Singeton”对我来说似乎是最合乎逻辑的答案。这很容易做到。您只需声明一个返回oglapp实例的函数...第一次创建它,然后返回它。类似的东西:

static *oglapp _instance = NULL;
*oglapp oglapp_factory() 
{
   if (_instance == NULL) _instance = new oglapp();
   return _instance;
}

你的“extern”文件声明了类定义和(外部存在......)“oglapp_factory()”。任何需要与类的(唯一)实例交互的例程都会调用工厂例程来获取它。