具有多个初始化的全局静态指针的用法



我在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);

相关内容

  • 没有找到相关文章

最新更新