将“常量指针”传递给函数

时间:2013-04-20 09:48:17

标签: c++

我编写了在二叉树上执行各种操作的程序。在开始时,我设置空根指针,然后调用几个insert()函数,将新节点添加到树中。

最后,我调用search()函数找到所请求的结构节点并返回它。


insert()函数有两个参数 - 对根指针的引用,以及常量的int键,它将被转换为节点结构并添加到树中

search()函数采用“常量根指针” - 不是引用,因为我想直接操作本地指针,我不希望它被更改。它需要的另一个参数是int key。


这是整个计划:

#include <iostream>

struct node
{
    node *p; // parent
    node *left, *right;
    int key;
};

void insert(node *&root, const int key)
{
    node newElement = {};
    newElement.key = key;

    node *y = NULL;
    while(root)
    {
        if(key == root->key) exit(EXIT_FAILURE);
        y = root;
        root = (key < root->key) ? root->left : root->right;
    }

    newElement.p = y;

    if(!y) root = &newElement;
    else if(key < y->key) y->left = &newElement;
    else y->right = &newElement;
}

node* search(const node *root, const int key)
{
    while( (root) && (root->key != key) )
        root = (key < root->key) ? root->left : root->right;

    return root;
}

int main()
{
    using namespace std;
    node *root = NULL;
    insert(root, 5);
    insert(root, 2);

    cout << search(root, 5)->key << endl;
    return 0;
}


我的问题是 - 为什么搜索功能不起作用?它显示错误 - 返回值类型与函数类型不匹配。但是,我就像宣言中所说的那样,回归了诗人!

此外,"const"关键字是o.k。?

3 个答案:

答案 0 :(得分:2)

rootconst node*,您的返回值为node*。它应该更改为const node*

const node* search(const node *root, const int key);

如果您需要search函数来返回非const node,那么它需要采用非const node参数。您可以提供重载以实现两种可能性

node* search(node *root, const int key);

答案 1 :(得分:1)

由于返回相同的指针,因此不能使用const参数和非const返回。而是编写两个版本,一个是const,一个是非const。

这是const_cast合理的少数情况之一。编写搜索功能的两个版本,一个可以使用const_cast调用另一个版本。

const node* search(const node *root, const int key)
{
    while( (root) && (root->key != key) )
        root = (key < root->key) ? root->left : root->right;

    return root;
}

node* search(node *root, const int key)
{
    return const_cast<node *>(search(const_cast<const node *>(root), key));
}

答案 2 :(得分:0)

search内,变量rootconst node*。但是,您尝试将其作为node*返回。你不能这样做,因为它会违反const-correctness。如果您返回指向真正const对象的指针,则客户端将能够修改该对象。

相反,您需要让函数返回const node*。要么是这样,要么root应该只是node*