为何无法通过构造函数给变量赋值且取值错误?
问题分析与修复
你的代码存在两个核心问题,导致Node构造函数无法正确赋值、insert方法输出随机值:
1. Node构造函数的自赋值错误
构造函数里的val = val;是自赋值操作——因为参数名和类成员变量名相同,编译器会优先使用局部的参数val,根本没给类的成员变量val赋值。这会导致成员变量始终是未初始化的垃圾值,所以你看到的是随机数或错误数值。
修复方法二选一:
- 用
this->val = val;明确指定给成员变量赋值(this指针指向当前对象的成员) - 给构造函数参数换个名字,比如
Node(int value),再写val = value;
修复后的Node类:
class Node{ public: int val; Node *left; Node *right; // 修复后的构造函数 Node(int val){ this->val = val; left = nullptr; right = nullptr; } };
2. insert函数中的野指针问题
你在insert函数里创建root = new Node(val);后立刻执行delete root;,直接释放了刚分配的内存,导致root变成野指针。后续访问root->val时,读取的是已经被回收的内存区域,结果必然是随机垃圾值。
修复方法:删除delete root;这行代码,保留动态分配的Node对象作为树的根节点。另外还要给后续的判断加else,避免空指针访问:
修复后的insert函数:
void BST::insert(int val){ if (root == nullptr){ root = new Node(val); cout << root->val << endl; // 现在会正确输出传入的val } else if (root->val == val){ cout<<"The value: " << val << " is duplicated!" << endl; } }
完整修复后的代码
#include<iostream> using namespace std; class Node{ public: int val; Node *left; Node *right; Node(int val){ this->val = val; left = nullptr; right = nullptr; } }; class BST{ public: Node *root; BST(){ root = nullptr; } void insert(int val); }; void BST::insert(int val){ if (root == nullptr){ root = new Node(val); cout << root->val << endl; } else if (root->val == val){ cout<<"The value: " << val << " is duplicated!" << endl; } // 可补充:插入值比根节点小/大时的子树插入逻辑 } int main() { BST bst; Node a = Node(10); cout << a.val << endl; // 正确输出10 bst.insert(8); // 正确输出8 return 0; }
额外提示
- 作为C++新手,要注意区分成员变量和函数参数,名字相同时用
this->明确指向成员变量是最直接的方法 - 用
new动态分配的内存不要随意delete,除非确定不再使用,否则会引发野指针问题 - 当前insert函数只处理了根节点的两种情况,还需要补充左子树、右子树的插入逻辑,才能实现完整的BST功能
内容的提问来源于stack exchange,提问作者Cody Gao
相关产品推荐
相关产品推荐

