2013-06-25 69 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)我真的不明白爲什麼你需要做什麼靜態,從析構函數訪問它。析構函數負責刪除實例變量,但是當析構函數體正在執行時它們還沒有被刪除。因此,除非您打算在不同的類實例中分享其值,否則您可能會使用「普通」類成員。

相關問題