类默认可以初始化它的"指针成员变量"?

时间:2016-10-20 01:03:07

标签: c++ pointers

struct Node{
    Node* ch[26];
    string str;
    Node(){
        for(int i = 0; i < 26; i++) {
            ch[i] = NULL;
        }
        str = "";
    }
};
class Solution {
public:
    vector<string> results;
    Node* root;
    void insert(Node* p, string s) {
        int len = s.size();
        for(int i = 0; i < len; i ++) {
            if(p->ch[s[i] - 'a'] == NULL) {
                p->ch[s[i] - 'a'] = new Node();
            }
            p = p->ch[s[i] - 'a'];
        }
        p->str = s;
    }
   vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) {}
}

这是我为我的问题定义的Trie。 &#34; root&#34;和&#34;矢量结果&#34;都是Solution的成员变量。我想问的问题是为什么我必须&#34;新的Node()&#34;在我使用root之前。我不需要&#34;新的矢量&#34;在我使用结果之前。我知道解决方案将调用默认构造函数然后&#34;结果&#34;将调用其默认构造函数。为什么不能使用Node的默认构造函数?

我碰巧意识到我的混淆可能与指针&#34;有关。但我仍然不了解细节。任何人都可以解释一下吗?我真的很感激。

2 个答案:

答案 0 :(得分:0)

Node* root;

*表示root是指向 Node对象的指针,它不是实际 {{1对象本身。指针所拥有的唯一存储足以保存指针所指向的内存地址。指针必须指向某个东西。现在,你不知道Node指向的是什么,这是......糟糕的。你不知道如果你试着读它会得到什么,如果你试着写它,你不知道你会粉碎什么。您需要指定root指向的内容,如果这是root,那么它也可以,但它也可以是预先存在的new Node()或{{1}在自动存储中(在堆栈的某处)。

另一方面,在

Node

Node不是指向vector<string> results; 对象的指针。它是实际的results对象。它存储。没有必要为它分配内存,只需在堆栈上声明它为它分配所有内容并调用它的默认构造函数。

答案 1 :(得分:0)

root只是一个指针,但你没有指定任何东西指向它。您需要分配一个新的Node对象,然后将该对象的地址分配给root,例如:

class Solution {
public:
    vector<string> results;
    Node* root;

    Solution() {
        root = new Node;
    }

    ~Solution() {
        delete root;
    }

    ...
};

否则,不要让root成为指针:

class Solution {
public:
    vector<string> results;
    Node root;

    ...
};

另外,您的Node类需要析构函数来销毁添加到其中的所有子节点:

struct Node{
    Node* ch[26];
    string str;

    Node(){
        for(int i = 0; i < 26; i++) {
            ch[i] = NULL;
        }
    }

    ~Node(){
        for(int i = 0; i < 26; i++) {
            delete ch[i];
        }
    }
};