C++参考问题
C++ Reference Issue
我最近问了一个关于在C++11中创建类的正确方法的问题。我通过建立一个Tree
课程进行练习,并收到了一些很棒的建议。然而,我在理解为什么我的代码不起作用时遇到了一点困难。
特别是,我很难理解为什么我的insert
方法不能正常工作。
template<typename T>
class Tree {
private:
struct Node {
T data;
Node* p_left;
Node* p_right;
};
Node* newNode(T data) { return new Node {data, nullptr, nullptr}; }
Node* root_;
//Other functions, etc... (copy constructor and copy assignment operator)
public:
void insert(T const data) {
Node*& root = root_;
while (root != nullptr) {
root = (data <= root->data ? root->p_left : root->p_right);
}
root = newNode(data);
}
Tree(): root_(nullptr) {}
//Other constructors, functions, etc...
};
如果我创建一个新的Tree
对象,然后用一些数据填充该对象,那么该对象只保留最后一段插入的数据。我知道我在某个地方搞砸了,因为我的指针引用,但我不知道在哪里。任何正确方向的建议都将不胜感激。
两个问题。。。首先,在第一次插入树时,您没有更新root
:
if (root == nullptr) { return newNode(data); }
事实上,即使insert
函数返回void
,也会返回新节点。如果您完全删除了这一行,代码应该可以工作。如果root
以nullptr
开始,则while循环将被跳过,并且root
将被更新为新节点。
第二个问题是,您使用的是对Node指针的引用,这意味着每次创建新节点时都要移动Tree的root_
。这不一定是个好主意。就我个人而言,我会这样写:
void insert(T const data) {
Node** proot = &root_;
while (*proot != nullptr) {
proot = (data <= (*proot)->data ? (*proot)->p_left : (*proot)->p_right);
}
*proot = newNode(data);
}
相关文章:
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- C++ 而循环问题 Codecademy 参考 [已解决]
- 我有几个关于参考变量的问题
- MSYS2静态QT未定义的参考问题
- OPENCV筛选未定义的参考问题
- 有关参考和指针的问题
- Python C-API:PYDICT_GETITEM上的分割故障,可能的参考问题
- 参考类型静态数据成员的问题可能是编译器错误
- 通过参考问题
- 命名空间外部变量的未定义参考/多重定义,C 结构问题
- 关于通用参考和左值参考的问题
- 通过参考问题
- 矢量参考问题
- VS 2010构建问题:参考问题
- 课堂自我参考问题
- C++参考问题
- 关于指针和参考文献的两个简短问题
- 这个快速排序有什么问题,我从书中参考它
- OpenCV 2.3编译问题-未定义的参考- Ubuntu 11.10