我可以从另一个函数中初始化静态成员吗​​?

时间:2013-06-25 20:18:53

标签: c++ static scope initialization member

struct中有一个静态成员,因为它在析构函数中是必需的。

struct Form
{
    // ...
    ~Form()
    {
        // access World here
    }
    static btDynamicsWorld *World;
};

有没有办法从另一个函数中初始化这个静态成员?

void ModulePhysics::Init()
{
    // ...
    btDynamicsWorld *Form::World = /* ... */;
}

我当前的代码会导致这两个编译错误。

  

错误1错误C2655:'Form :: World':当前范围内的定义或重新声明非法

     

错误2错误C2086:'btDynamicsWorld * Form :: World':重新定义

4 个答案:

答案 0 :(得分:5)

不,你不能。但是你可以将它初始化为NULL,并且在函数中,如果它是NULL,则进行真正的初始化。

编辑:提供一个示例:

void ModulePhysics::Init()
{
    // ...
    if(Form::World == NULL)
    {
        // The real initialization
    }
}

某处,在文件范围内(在C文件中,而不在标题中!):

btDynamicsWorld* Form::World = NULL;

答案 1 :(得分:2)

不,你不能。

  

类的成员列表中的静态数据成员的声明不是定义。您必须在类声明之外定义静态成员,在命名空间范围

Here您可以获得有关如何以及在何处初始化静态类变量的更详细说明。

答案 2 :(得分:0)

在init()方法中删除静态变量前面的类型。

它应该解决你的问题,我希望。

答案 3 :(得分:0)

1)所有静态类成员(除了在类定义中立即初始化的积分成员外)也应在外部定义(最好在.cpp文件中定义,以便定义仅由编译器处理一次)。例如:

// form.h
struct Form
{
    static btDynamicsWorld *World;
};


// form.cpp

// You can initialize World here as well if you want to,
// but you don't have to, as long as it's not const.
// However, it is generally a good idea to initialize
// pointers to NULL (or nullptr in C++11).
btDynamicsWorld *Form::World;

这只能在全球范围内完成。如果不这样做,如果尝试引用此变量,则会出现链接器错误(未定义的符号)。

2)你似乎试图做的不是“初始化”,而只是分配给静态成员。您几乎正确地执行了此操作,但您无需重新声明类型:

void ModulePhysics::Init()
{
    Form::World = /* ... */;
}

3)我真的不明白为什么你需要做一些静态的东西来从析构函数中访问它。析构函数负责删除实例变量,但是在析构函数的主体执行时它们尚未被删除。因此,您也可以使用“普通”类成员,除非您计划在不同的类实例之间共享其值。