как избежать копирование указателя в с++
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 не меняется, можете ли вы объяснить почему?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Из-за передачи по значению. Передавайте по ссылке:
void clearSubTree(Node* &root)
{
// clear
root = nullptr;
}
Можно, конечно, использовать Node**, но это не удобно.
Только вот чтобы это сработало -
tree.clearSubTree(tree.getRoot());
(кстати, зачем?!!!), надо
Node*& getRoot() { return m_root; }
Но почему бы вам просто не написать
void clearSubTree()
{
m_root = nullptr;
}
и
tree.clearSubTree();
Оно и проще, и логичнее...