如何在 class 的方法参数中访问 class 私有数据成员,我收到非静态数据成员无效使用错误
how to access class private data members in method parameter of class , i get an error invalid use of non static data members
我有两个 classes Node 和 AvlTree ,我稍后会制作 AvlTree 的其他方法,但我无法访问 AvlTree 自己的 root
数据成员 class ,我如何在 AvlTree class inOrder
方法中访问 root
。
我的代码如下
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
但这也不起作用,我在这里做错了什么,我也不能在它自己的 class 中这样访问。
我收到类似
的错误
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
的参数)不是好主意,因为很容易就代码的作用误导人类读者。因此,通常认为以与成员不同的方式命名参数更可取。
我有两个 classes Node 和 AvlTree ,我稍后会制作 AvlTree 的其他方法,但我无法访问 AvlTree 自己的 root
数据成员 class ,我如何在 AvlTree class inOrder
方法中访问 root
。
我的代码如下
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
但这也不起作用,我在这里做错了什么,我也不能在它自己的 class 中这样访问。
我收到类似
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
的参数)不是好主意,因为很容易就代码的作用误导人类读者。因此,通常认为以与成员不同的方式命名参数更可取。