2017-03-08 50 views
2

我用C++和指針創建了新的函數,而且我對這個C++代碼有問題。通常這段代碼必須顯示「true」,但不是。提前致謝。在C++類中未初始化的指針

class Trie{ 
    public: 
     Trie* root; 
     int color; 
     Trie(){ 
     color=0; 
     } 
     ~Trie(){ 
     } 
    }; 

int main(){ 
    Trie test; 
    if(test.root==nullptr)cout<<"true"<<endl; 
    } 
+5

因爲您從未將其設置爲'nullptr'。在'color = 0;'之後的構造函數中,寫'root = nullptr;' – Arash

+6

您從未初始化過'test.root',當您編寫'test.root == nullptr'時,您會發生什麼? –

+2

由於你的構造函數不初始化根,它可以是任何東西。 – user31264

回答

9

C和C++,不像Java和C#,不會自動零初始化由於性能原因存儲或對象的成員,因爲沒有點覆蓋內存,如果兩次你只是打算無論如何設置自己的價值;缺點是你必須非常小心,以確保你不首先使用未初始化的數據。

解決您的問題,您可以設置成員在構造函數中,或在初始化列表:

Trie() { 
    this->color = 0; 
    this->root = nullptr; 
} 

或者:

Trie() : 
    color (0), 
    root (nullptr) 
{  
} 

至於你color值,可以考慮使用因爲沒有保證int將是32位整數(假設您需要存儲0-255個RGB值):

struct RgbColor { 
    uint8_t r; 
    uint8_t g; 
    uint8_t b; 

    RgbColor() : 
     RgbColor(0, 0, 0) { 
    } 

    RgbColor(uint8_t r, uint8_t g, uint8_t b) : 
     r(r), 
     g(g), 
     b(b) { 
    } 

    RgbColor(uint32_t rgb) : 
     r((rgb >> 24) & 0xFF), 
     g((rgb >> 16) & 0xFF), 
     b((rgb >> 8) & 0xFF) { 
    } 
} 
+0

非常感謝這個不錯的答案。 –