C++ 外部指针

C++ extern pointer

所以我正在编写一个程序,其中有一个很大的 class 叫做 oglapp,还有一大堆其他 class 正在使用它。我想要实现的是在我所有的 .cpps 中拥有一个 super-global oglapp*。我的方法是在 main.cpp 中声明一个 oglapp*,它有入口点(它设置指针并开始 运行 class),并且我在oglapp 的 header 文件结尾。理论上,如果我在我的项目中的任何地方使用 oglapp class,我需要为它包含 header,其中包括 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 header,还尝试放置 extern oglapp* 应用;对于每个 classX,我都尝试了我能想到的一切。此外,奇怪的是,我在所有 classX 中都没有出现空引用错误。他们中的一些人可以毫无问题地使用该应用程序,而另一些人则将其视为空指针。我还没有发现是什么决定了它是否有效。

我做错了什么?另外,如果不可能以这种方式声明一个指向 class 的 super-global 指针,我应该怎么做呢?

很难看出问题出在哪里,因为您还没有发布所有代码。但是,您可以通过使 oglapp 成为单例来避免空引用问题。有关详细信息,请参阅 http://en.wikipedia.org/wiki/Singleton_pattern

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

您可以在 main 或调用堆栈的更高层初始化所有内容,或者您​​可以创建一个 oglapp 单例。

或者,因为它看起来不像 oglapp 对其构造函数有任何参数,您可以 extern 一个实际实例并创建 那些 在全局范围内,而不是指针。然后你必须警惕 static initialisation order fiasco(查一下!),但至少你的其他全局对象会有 chance …如果你小心点。

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

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

您的 "extern" 文件声明了 class 定义和 (...的外部存在) "oglapp_factory()." 任何例程需要与 class 的 (唯一) 实例交互,调用工厂例程来获取它。