3

a 中有一个静态成员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

4 回答 4

5

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

编辑:提供一个例子:

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

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

btDynamicsWorld* Form::World = NULL;
于 2013-06-25T20:21:57.383 回答
2

不,你不能。

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

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

于 2013-06-25T20:27:34.993 回答
0

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

我希望它应该可以解决您的问题。

于 2013-06-25T20:23:09.703 回答
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)我真的不明白为什么你需要使任何静态的东西从析构函数中访问它。析构函数负责删除实例变量,但是当析构函数的主体执行时它们还没有被删除。因此,您也可以使用“普通”类成员,除非您计划在不同的类实例之间共享它的值。

于 2013-06-25T20:34:22.713 回答