如何在类的方法参数中访问类私有数据成员,我得到一个错误,错误地使用了非静态数据成员

问题描述

我有两个类Node和AvlTree,稍后我将使用AvlTree的其他方法,但无法在其自己的类中访问AvlTree的root数据成员,如何在AvlTree中访问rootinorder方法

我的代码在这里

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的参数)不是一个好主意,因为很容易就代码的作用误导人类读者。因此,通常建议使用与成员不同的名称来命名参数。