我在main.cpp文件中声明了一个全局静态指针。我是否需要在每个使用它的cpp文件中对其进行初始化?
// main.cpp
...
static int *levels;
...
int main()
...
然后,如果我必须在其他一些文件而不是main.cpp中初始化它,那么全局静态变量的用法是什么?我可以在每个cpp文件中声明单独的指针。
答案 0 :(得分:1)
这取决于您何时需要初始化。
如果还有其他需要它的静态对象:
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
。 [编辑以回应评论]
如果你在主要开始之前不需要它,那么:
int main()
{
levels = new int[someValueCalculatedInMain];
|
作品。
答案 1 :(得分:0)
允许从多个C ++文件访问的备用解决方案:
在头文件中:
int * getLevels();
在cpp文件中:
int * getLevels()
{
static int * levels = new int[calculatedArraySize];
return levels;
}
警告:此代码不是线程安全的(无论如何在C ++ 11之前)。如果您的应用程序使用多个线程,则需要一些额外的代程序终止时,此代码也会泄漏数组。通常情况下这不是问题,但如果有问题,那就是解决方案。
答案 2 :(得分:0)
我一般不建议使用单身类是好风格,但这就是我要做的事情:
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);