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 的 (唯一) 实例交互,调用工厂例程来获取它。
所以我正在编写一个程序,其中有一个很大的 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 的 (唯一) 实例交互,调用工厂例程来获取它。