2017-03-08 23 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'に設定されていないためです。 – Arash

+6

'test.root == nullptr'を書いたときに何が起こると思いますか?' test.root'を初期化したことはありませんか? –

+2

コンストラクタはルートを初期化しないので、何でも構いません。 – user31264

答えて

9

あなたはとにかく独自の値を設定するつもりならない点上書きするメモリが二回ありませんように、CおよびC++は、JavaやC#とは異なり、自動的にパフォーマンス上の理由から、メモリまたはオブジェクトのメンバーをゼロ初期化しません。欠点は、初期化されていないデータを最初に使用しないように注意する必要があることです。あなたの問題を解決するために

、あなたは、コンストラクタでメンバを設定するか、または初期化リストに:

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

または:あなたのcolor値については

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

、使用することを検討してください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

この素敵な答えに感謝します。 –

関連する問題