2011-10-13 110 views
-1

我不想使用指針時,我不必,但這裏的問題:在下面的代碼中,如果我刪除星號,並使level只是一個object,當然刪除行level = new Level;我得到一個運行時錯誤,原因是level然後被初始化在第一行,在之前initD3Dinit_pipeline - 設置投影和視圖使用的方法。您看到問題是level使用了這兩件事,但首先完成後,我得到一個null指針異常。沒有構造函數的類強制使用指針類型?

這是一個簡單的答案是使用指針的情況嗎?我以前遇到過這個問題,基本上,當一個類類型不接受任何參數時,你基本上會覺得非常煩惱,你基本上是在聲明它的地方初始化它......或者我對這最後一部分錯誤了嗎?

Level* level; 

D3DMATRIX* matProjection,* matView; 

//called once 
void Initialise(HWND hWnd) 
{ 
initD3D(hWnd); 
    init_pipeline(); 

level = new Level; 
} 

我從C#和C#來了,你只是聲明一個名字與線Level level;參數與否,你仍然需要在某個時候初始化它。

+0

這與'Level'是否具有用戶定義的構造函數,或者構造函數是否帶參數無關。問題是全局變量在'main'輸入之前被初始化。如果您編寫了'Level level(1,2,3);',則會看到完全相同的內容,相應的構造函數將在'initD3D'和'init_pipeline'之前調用。 –

回答

8

你是正確的,如果你做:

Level level; 

然後level將在此時被實例化。這是因爲上述表達式似乎是全球性的,不僅僅是聲明,而且還有定義

如果這導致你的問題,因爲Level正在被實例化之前,其他人正在實例化,那麼你已經遇到了爲什麼全局吸引的經典理由。

您試圖通過製作level指針並稍後「初始化」來解決此問題。 Wjhat可能會讓你大吃一驚的是,level仍然在同一點實例化。現在的區別是類型level。它不再是Level;現在它是一個指向level的指針。如果您在代碼輸入Initialize時檢查level的值,則會看到它的值爲NULL。

它具有NULL值而不是垃圾值,因爲全局變量是靜態初始化的,在這種情況下,這意味着初始化爲零。

但是,這一切都與真正的問題有點切線,這就是您首先使用全局變量。如果您需要按特定順序實例化對象,則按照該順序對它們進行實例化。不要使用全局變量,你可能會發現通過這樣做,你也不需要使用指針。

+0

「它有一個值 - 但是這個值是垃圾」 - 它不是垃圾,因爲全局變量是零初始化的。 –

+0

@Steve:當然,你是對的。編輯。 –

0

這是一個簡單的情況下,其中的答案是使用指針

是啊,基本上是這樣。