初始化结构是不可变的吗?

时间:2013-02-04 04:12:40

标签: c++

我将测试用例初始化为全局变量,在这里:

void InsertNode(BSTNode* &t, const int &key) {
    if (t == NULL) {
        t = new BSTNode;
        t->key = key;
        t->left = t->right = NULL;
    } else {
        if (key != t->key) {
        if (key < t->key)
                InsertNode(t->left, key);
            else
                InsertNode(t->right, key);
        }
    }
}

BSTNode t1[] = {
 {4, &t1[1], &t1[2]},
 {2, &t1[3], &t1[4]},
 {6, &t1[5], &t1[6]},
 {1, NULL, NULL},
 {3, NULL, NULL},
 {5, NULL, NULL},
 {7, NULL, NULL}
};

int main() {
    InsertNode(t1, 0);
    return 0;
}

但是,当我尝试修改t1时,它会给我一个错误:

invalid initialization of non-const reference of type 'BSTNode*&' from a temporary of type 'BSTNode*'

有人可以帮我解释一下吗?谢谢!!

1 个答案:

答案 0 :(得分:1)

问题是你的函数声明它可能会改变指针:

void InsertNode(BSTNode* &t, const int &key) {

它将非const指针作为参数引用,因此它有可能修改该指针。但是当你这样做时:

InsertNode(t1, 0);

你传入一个不可修改的指针,因为t1是一个数组。可以像指针一样使用数组,但是不能将指针指向其他位置。

解决这个问题的一种方法是拥有两个不同的功能:

void InsertNode(BSTNode* &t, const int &key);

void AddNode(BSTNode* t, const int &key) {
    assert(t!=NULL);
    if (key != t->key) {
    if (key < t->key)
            InsertNode(t->left, key);
        else
            InsertNode(t->right, key);
    }
}

void InsertNode(BSTNode* &t, const int &key) {
    if (t == NULL) {
        t = new BSTNode;
        t->key = key;
        t->left = t->right = NULL;
    } else {
        AddNode(t,key);
    }
}

然后致电

AddNode(t1, 0);