在C ++中返回指向对象指针的指针

时间:2014-04-02 00:34:48

标签: c++ pointers binary-tree

我正在尝试定义一组模板类来表示C ++中的搜索树 在 find 方法中,我需要返回节点的指针(表示为指针),该指针包含给定的键;通过这种方式,我将重用 find 方法来实现插入和删除。

template <class K, class R>
struct Node {
    K key;
    R record;

    inline Node(K k, R r) {
        this->key = k;
        this->record = r;
    }
};

template <class K, class R>
struct BST_Node : public Node<K,R> {
    BST_Node<K,R> *sx;
    BST_Node<K,R> *dx;

    inline BST_Node(K key, R record)
    : Node<K,R>(key, record) {
        this->sx = NULL;
        this->dx = NULL;
    }

    BST_Node<K,R> **find(K k) {
        BST_Node<K,R> **p = k < this->key ? &this->sx : &this->dx;

        while (*p && k != (*p)->key)
             p = k < (*p)->key ? &(*p)->sx : &(*p)->dx;

        return p;
    }
/* other methods */
};

只有一个问题:如果密钥在根目录中会怎样? 我无法返回&amp; this because this,我该怎么办?

原因是因为我想使用指针指针是这样我可以返回NULL指针的地址,所以对于插入我可以这样写:

BST_Node<K,R> *insert(K k, R r) {
    BST_Node<K,R> **p = this->find(k);

    if (*p == NULL) //if the search fails
        *p = new BST_Node<K,R>(k, r);

    return *p;
}

2 个答案:

答案 0 :(得分:0)

你不清楚。 在您的情况下,Pointer this 的类型为

BST_Node<K,R>* const

这意味着你无法改变方向(我不知道如何具体描述它,就像指针指示的地址一样......)。如果您返回

//BST_Node<K,R>**
return &this;

这意味着您可以通过返回值更改 this 的值。不允许这样做。所以发生错误。

为什么你必须在这里返回双指针?

我看到了你的版本,我想你可以在函数find()中返回一个NULL,表示你在root上找到了密钥。编写递归 find 函数时会有点复杂,但由于您使用了循环,因此只需在find函数的第一个处添加if语句即可。在插入函数中这样写:

if (p == NULL) //if returns the root
    /*do sth.*/

只是一个提示,我不会在root用户保存任何数据,而且当我使用树时,我的树根通常会和树一样长。

答案 1 :(得分:-1)

我认为你应该更多地重读这个笔记。

问题在于&amp; this位于内存中的某个位置,它指向当前对象“you'in”(您的代码正在执行的当前对象范围)。
返回&amp;这将指向你的代码所在的当前对象,这不是你想要的(它实际上取决于编译器,我从来没有读过编译器的任何“承诺”,在这种情况下返回任何值) ,它不符合C ++标准)

解决方案很简单:

void* tothis = malloc(sizeof(void*)); // allocate memory that will survive leaving the current scope
tothis=this; // copy the current object memory address to the object
return &tothis; // return what you want

请不要忘记随后释放tothis的内存地址(这样你就不会有泄漏)。