2017-03-08 4 views
2

Ich bin neu mit C++ und Zeigern und ich habe ein Problem mit diesem C++ - Code. Normalerweise muss dieser Code "true" anzeigen, tut dies aber nicht. Danke im Voraus. Speicher oder Objektelemente aus LeistungsgründenZeiger nicht initialisiert in C++ Klasse

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

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

weil Sie es niemals auf 'nullptr' setzen. Im Konstruktor nach 'color = 0;', schreibe 'root = nullptr;' – Arash

+6

Du hast 'test.root' nie initialisiert, was hast du erwartet, als du 'test.root == nullptr' geschrieben hast? –

+2

Da Ihr Konstruktor Root nicht initialisiert, kann es alles sein. – user31264

Antwort

9

C und C++, im Gegensatz zu Java und C#, nicht automatisch Null initialisieren, da es kein Punkt überschreiben Speicher sind doppelt, wenn du gehst, um einfach mal so einen eigenen Wert gesetzt; Der Nachteil ist, dass Sie sehr vorsichtig sein müssen, um sicherzustellen, dass Sie nicht zuerst nicht initialisierte Daten verwenden.

Ihr Problem zu beheben, Sie entweder das Mitglied im Konstruktor oder in der Initialisierungsliste einstellen:

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

Oder:

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

Was Ihren color Wert, hält eine Verwendung Tupel stattdessen, weil es keine Garantien gibt, dass int eine 32-Bit-Ganzzahl sein wird (vorausgesetzt, Sie müssen 0-255 RGB-Werte speichern):

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

Vielen Dank für diese nette Antwort. –

Verwandte Themen