2013-06-25 35 views
3

有一个struct静态成员,因为它需要在析构函数。我可以从另一个函数内初始化一个静态成员吗​​?

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

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

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

我目前的代码导致了这两个编译器错误。

错误1错误C2655: '表::世界':定义或重新声明非法电流范围

错误2错误C2086: 'btDynamicsWorld *表格::世界':重新定义

+0

你确定,一个静态成员是你想要的吗?这对每个班级都是一样的! – Sebastian

+0

@Sebastian'struct'表示物理模拟中的刚体。 “世界”代表了许多物体之间物理交互的空间,只有一个实例存在。必须从破坏的世界中移除尸体,否则模拟会崩溃。如果有更好的方法来解决这个问题,我很乐意听到它。 – danijar

+0

你知道在一个struct中声明一个变量static并不会为它保留任何RAM,并且你需要在其他地方的第二个RAM声明吗? –

回答

5

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

编辑:提供一个例子:(!在C文件,而不是在标题)

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

某处,在文件范围:

btDynamicsWorld* Form::World = NULL; 
+0

这会很好,你能提供一个简短的代码示例吗? – danijar

+0

非常感谢。现在编译。我需要在每个源文件中初始化静态成员,包括struct? – danijar

+0

不可以。您必须在一个文件,你可能没有在多个文件中定义它(一个定义规则,ODR) – Sebastian

0
在init

()方法去除在静态变量前键入。

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

+0

我之前曾尝试过,但它会抛出“无法解析的外部符号”链接器错误。 – danijar

2

你就是不行。

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

Here您可以更详细地了解如何以及在哪里初始化静态类变量。

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)我真的不明白为什么你需要做什么静态,从析构函数访问它。析构函数负责删除实例变量,但是当析构函数体正在执行时它们还没有被删除。因此,除非您打算在不同的类实例中分享其值,否则您可能会使用“普通”类成员。

相关问题