在 C++ 中解析 public 函数时出现编译错误

Compilation errors in resolving public functions in C++

我正在尝试一道 classic 编程面试题。这个想法是从一个排序的数组创建一个平衡的二叉树(或最小高度的树)。这是我的节点 class.

class node{

public:
    node(int data):value(data), left(nullptr), right(nullptr){}

    node* sortedArrayToBinaryTree(int arr[], int start, int end){

        if(start > end) return nullptr;

        int mid = (start + end)/2;

        node* p = new node(arr[mid]);
        p->left = sortedArrayToBinaryTree(arr, start, mid-1);
        p->right = sortedArrayToBinaryTree(arr, mid+1, end);
        return p;

    }

    void preorder(node* root){
        if(root == nullptr) return;
        std::cout<<root->value<<" "<<std::endl;
        preorder(root->left);
        preorder(root->right);
    }
private:
    int value;
    node* left;
    node* right;
};

我有理由相信我的逻辑没问题。然而,问题是当我编写客户端代码来测试功能时,节点 class 中的 public 方法没有得到解决。

int main() {

    int arr[] = {2,7,9,13,19,21};

    node* root = sortedArrayToBinaryTree();
    preorder();

    return 0;
}

我得到以下编译错误。

error: use of undeclared identifier 'sortedArrayToBinaryTree'
    node* root = sortedArrayToBinaryTree(arr, 0, 5);
                 ^
main.cpp:10:5: error: use of undeclared identifier 'preorder'
    preorder();
    ^
2 errors generated.

您不仅忘记了将实际参数传递给函数,而且忘记了这些非静态成员函数(方法)需要调用一个 class 实例这一事实。我没看到。

然而,让 sortedArrayToBinaryTreepreorder 成为 node 的成员没有意义。如果你正在制作一棵树,应该有 class tree 来处理 sorting/ordering 等......所以,逻辑不正确。

函数sortedArrayToBinaryTree是classnode的非静态成员函数。

不能用这个class的对象来调用它。

您可以在 class 定义中将其声明为静态数据成员

static node* sortedArrayToBinaryTree(int arr[], int start, int end){
//...

在这种情况下你可以写

node* root = node::sortedArrayToBinaryTree( /* arguments */ );

并且由于该函数没有默认参数,您必须明确指定它们。

同样适用于函数preorder

考虑到这些函数不使用 class 的数据成员。所以class设计是错误的。

我认为你应该将这些函数声明为 class.

的静态成员函数

您遇到编译器错误,因为函数 sortedArrayToBinaryTreepreordernode 中声明为成员函数,而您在 main 中使用它们,就好像它们是非成员函数。

我能想到以下方法可以解决问题。

使函数成为非成员函数

声明函数。

node* sortedArrayToBinaryTree(int arr[], int start, int end);
void preorder(node* root);

制作 nodefriendnode

class node{

   public:
      node(int data):value(data), left(nullptr), right(nullptr){}

      friend node* sortedArrayToBinaryTree(int arr[], int start, int end);
      friend void preorder(node* root);

   private:
      int value;
      node* left;
      node* right;
};

然后使用 main 中的它们,并使用正确的参数。

int main() {

   int arr[] = {2,7,9,13,19,21};

   node* root = sortedArrayToBinaryTree(arr, 0, sizeof(arr)/sizeof(arr[0]));
   preorder(root);

   return 0;
}

创建函数static成员函数

class node{

   public:
      node(int data):value(data), left(nullptr), right(nullptr){}

      static node* sortedArrayToBinaryTree(int arr[], int start, int end);
      static void preorder(node* root);

   private:
      int value;
      node* left;
      node* right;
};

并从 main.

调用它们
int main() {

   int arr[] = {2,7,9,13,19,21};

   node* root = node::sortedArrayToBinaryTree(arr, 0, sizeof(arr)/sizeof(arr[0]));
   node::preorder(root);

   return 0;
}