问题描述
我有两个类Node和AvlTree,稍后我将使用AvlTree的其他方法,但无法在其自己的类中访问AvlTree的root
数据成员,如何在AvlTree中访问root
类inorder
方法。
class Node {
public:
int key;
Node* left;
Node* right;
int height;
Node(int key) : key(key),left(nullptr),right(nullptr),height(1) {};
};
class AvlTree {
private:
Node* root;
public:
AvlTree() : root(nullptr) {};
int height(Node* ptr) {
}
int getBalanceFactor(Node* ptr) {
}
void inorder(Node* itr = root) { // <--- i get an error here
}
};
我尝试过this->root
,但是那也行不通,我在这里做错了什么,也无法在自己的类中这样访问。
我遇到了类似的错误
09_avl_tree.cpp:36:34: error: invalid use of non-static data member ‘AvlTree::root’
36 | void inorder(Node* itr = root) {
| ^~~~
09_avl_tree.cpp:15:15: note: declared here
15 | Node* root;
| ^~~~
我不想将root
设为静态数据成员。因为我想要AvlTree的多个实例。
解决方法
编译器告诉您的简短答案是,您不能将其作为参数的默认值。
最简单的方法是重载inOrder()
函数,例如(在AvlTree
的定义之内)
void inOrder(Node *itr)
{
// whatever
}
void inOrder()
{
inOrder(root);
}
此外,与您的问题无关,Node
构造函数中成员名称的阴影(例如,用于初始化名为key
的成员的名为key
的参数)不是一个好主意,因为很容易就代码的作用误导人类读者。因此,通常建议使用与成员不同的名称来命名参数。