Тот же адрес, переданный во время цепочки методов в C ++ для древовидной структуры данных? - PullRequest
0 голосов
/ 06 мая 2019

Я наткнулся на реализацию дерева в сети и был озадачен функцией удаления реализации. Все остальное понятно, кроме идеи цепочки методов.

Насколько я понимаю, * это ключевое слово возвращает адрес созданного объекта и является уникальным для каждого объекта. Так что, если я сделаю что-то подобное в основной функции. Поскольку я создал один объект, каждый раз, когда используется ключевое слово this, у него будет один и тот же адрес.

    Bst newTree; //some random address associated with 
    newTree.remove(10).remove(20).remove(30);

Это часть кода, но она показывает, как используется ключевое слово "this".

BST& remove(int val, BST* parent =NULL){
   if(val < value){
     if(left != NULL)
       {
         left->remove(val,this)
       }
    }

  //some more code to deal with greater and lower values 
  return *this;
}

Полагаю, моя путаница заключается в том, что в рекурсивных вызовах мы даем адрес "this", который является тем же адресом, потому что был создан только один экземпляр этого класса. Так как же один вызов функции удаления отстает от другого?

1 Ответ

0 голосов
/ 07 мая 2019

this - это просто указатель на «текущий» объект;это параметр, который передается каждой функции-члену "за кулисами".

Давайте перепишем это в более "C-подобной" форме, без классов и магии.

Вот упрощенныйtree:

struct Node
{
    int value;
    Node* left;
    Node* right;
};

, а вот remove, который явно берет указатель на «текущий узел» и возвращает его вызывающей стороне:

Node* remove(Node* self, int val, Node* parent)
{
    if (val < self->value)
    {
        if (self->left != NULL)
        {
            remove(self->left, val, self);
        }
        // ...
    }
    return self;
} 

Обратите внимание, что рекурсивныйвызов remove получает self->left этого вызова в качестве аргумента self, а self этого вызова - parent.
Результат рекурсии игнорируется;функция всегда возвращает свой self аргумент без изменений.

Способ "цепочки" этой функции заключается в передаче ее результата следующему вызову функции:

Node *tree = ...;
remove(remove(remove(tree, 10), 20), 30);

Версия класса C ++работает так же.
Разница в том, что this является неявным параметром функции в этом случае, и возвращая ссылку, вы можете использовать обычный синтаксис вызова функции-члена, но базовая механика точно такая же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...