在 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 实例这一事实。我没看到。
然而,让 sortedArrayToBinaryTree
和 preorder
成为 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.
的静态成员函数
您遇到编译器错误,因为函数 sortedArrayToBinaryTree
和 preorder
在 node
中声明为成员函数,而您在 main
中使用它们,就好像它们是非成员函数。
我能想到以下方法可以解决问题。
使函数成为非成员函数
声明函数。
node* sortedArrayToBinaryTree(int arr[], int start, int end);
void preorder(node* root);
制作 node
个 friend
个 node
。
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;
}
我正在尝试一道 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 实例这一事实。我没看到。
然而,让 sortedArrayToBinaryTree
和 preorder
成为 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.
的静态成员函数您遇到编译器错误,因为函数 sortedArrayToBinaryTree
和 preorder
在 node
中声明为成员函数,而您在 main
中使用它们,就好像它们是非成员函数。
我能想到以下方法可以解决问题。
使函数成为非成员函数
声明函数。
node* sortedArrayToBinaryTree(int arr[], int start, int end);
void preorder(node* root);
制作 node
个 friend
个 node
。
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;
}