как избежать копирование указателя в с++

Рейтинг: 0Ответов: 1Опубликовано: 28.03.2023
class BinaryTree{
private:
   class Node;
   Node* m_root;
public:
   BinaryTree() : m_root(nullptr) {};
   ~Binarytree { // some destructor }

   const Node* getRoot() const { return m_root; }
   Node* getRoot() { return m_root; }

   void clearSubTree(Node* root)
   {
      // clear
      root = nullptr;
      /* root равен m_root, но при присваении root = nullptr m_root не меняется */
   }
};

class BinaryTree::Node
{
private:
    Item m_data;
    Node* m_left = nullptr;
    Node* m_right = nullptr;
public:
    // getters, setter, constructor, desturctor
};

int main() {
   BinaryTree tree;
   // filling tree

   tree.clearSubTree(tree.getRoot());
   return 0;
}

При вызове в main tree.clearSubTree(tree.getRoot()); в root запишется m_root, но при присвоении m_root не меняется, можете ли вы объяснить почему?

Ответы

▲ 2Принят

Из-за передачи по значению. Передавайте по ссылке:

void clearSubTree(Node* &root)
{
    // clear
    root = nullptr;
}

Можно, конечно, использовать Node**, но это не удобно.

Только вот чтобы это сработало -

tree.clearSubTree(tree.getRoot());

(кстати, зачем?!!!), надо

Node*& getRoot() { return m_root; }

Но почему бы вам просто не написать

void clearSubTree()
{
   m_root = nullptr;
}

и

tree.clearSubTree();

Оно и проще, и логичнее...