我在main.cpp文件中声明了主函数外的全局静态指针。我需要在使用的每个cpp文件中初始化它吗?
// main.cpp
...
static int *levels;
...
int main()
...
那么,如果我必须在其他一些文件而不是main.cpp中初始化它,那么全局静态变量的用途是什么?我可以在每个cpp文件中声明单独的指针。
这取决于何时需要初始化它。
如果有其他静态对象需要它:
static int * levels = new int[COMPILE_TIME_CONST];
这是一个良好的开端。请注意,单个编译单元中的静态变量按照它们在源中出现的顺序进行初始化。在其他编译单元中,初始化相对于静态的顺序是一个复杂得多的问题。
Definition: compilation unit is a single cpp file
and the headers it includes directly or indirectly.
幸运的是,您无法从任何其他编译单元访问levels
。[根据评论进行编辑]
如果您在main启动之前不需要它,那么:
int main()
{
levels = new int[someValueCalculatedInMain];
|
工作。
允许从多个C++文件访问的替代解决方案:
在头文件中:
int * getLevels();
在cpp文件中:
int * getLevels()
{
static int * levels = new int[calculatedArraySize];
return levels;
}
警告:此代码不是线程安全的(在C++11之前)。如果您的应用程序使用多个线程,则需要一些额外的代码。当程序终止时,此代码还会泄漏数组。通常情况下,这不是一个问题,但如果是这样,就会有解决方案。
我通常不会建议使用singleton类是一种好的风格,但我会这样做:
MySingleton.hpp:
class MySingleton {
public:
static MySingleton& instance() {
static MySingleton theInstance;
return theInstance;
}
std::vector<int>& levels() { return levels_; }
private:
MySingleton() {
}
std::vector<int> levels_;
};
要在其他地方使用以上内容:
#include "MySingleton.hpp"
// ...
MySingleton::instance().levels().resize(10); // Creates 10 ints initialized to 0
为了缩短访问时间,你甚至可以将整个东西封装在自己的命名空间中,并在那里提供免费功能:
namespace MySpace {
class MySingleton {
// Blah, blah
};
std::vector& levels() {
return MySingleton::instance().levels();
}
}
并使用
MySpace::levels().resize(10);