使用多次初始化的全局静态指针?

时间:2014-04-25 19:47:14

标签: c++ static global-variables

我在main.cpp文件中声明了一个全局静态指针。我是否需要在每个使用它的cpp文件中对其进行初始化?

// main.cpp
...
static int *levels;
...
int main()
...

然后,如果我必须在其他一些文件而不是main.cpp中初始化它,那么全局静态变量的用法是什么?我可以在每个cpp文件中声明单独的指针。

3 个答案:

答案 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);