我在c ++中声明数据类型之后就出现了声明全局变量的问题。所以我声明了这个类(注意,这是在另一个.cpp文件中),然后尝试声明变量tree
。 BST *tree = new BST();
给出了一个未定义的引用错误,但如果我在我的主文件中定义它就没问题了。问题是我需要在进入主体之前使用它。任何帮助将不胜感激。
class Node {
public:
INT64 volatile key;
Node* volatile left;
Node* volatile right;
Node() {key = 0; right = left = NULL;} //default
};
class BST{
public:
Node* volatile root;
BST();
int contains(INT64 key);
int add(Node *nn);
Node* remove(INT64 key);
};
int BST::add(Node *n){
Node *volatile *pp = &root;
Node *p = root;
while(p){
if(n->key > p->key){
pp = &p->left;
} else if (n->key > p->key){
pp = &p->right;
} else {
return 0;
}
p = *pp;
}
*pp = n;
return 1;
}
Node* BST::remove(INT64 key){
Node *volatile *pp = &root;
Node *p = root;
while(p){
if(key < p->key){
pp = &p->left;
} else if(key > p->key){
pp = &p->right;
} else{
break;
}
p = *pp;
}
if(p == NULL){
return NULL;
}
if(p->left == NULL && p->right == NULL){
*pp = NULL;
} else if(p->left == NULL){
*pp = p->right;
} else if(p->right == NULL){
*pp = p->left;
} else{
Node *r = p->right;
Node *volatile *ppr = &p->right;
while(r->left){
ppr = &r->left;
r = r->left;
}
p->key = r->key;
p = r;
*ppr = r->right;
}
return p;
}
BST *tree = new BST();
答案 0 :(得分:0)
我认为&#34;未定义的引用错误&#34;是链接器错误,表示缺少已声明方法的实现。在这种情况下,声明了构造函数BST()
,但未实现。只是尝试一下,如果您输入BST() {}
而不是BST();
,它应该有效。
所以这实际上不是&#34;在错误的地方声明一个全局变量&#34 ;;如果声明形式为BST *tree = new BST()
的全局变量,编译器将检查BST
是否声明了相应的构造函数(显式或隐式);并且这样的构造函数是显式声明的,因此编译器不会引发任何错误。但是,由于现在在代码中引用了构造函数BST()
,链接器必须将实现绑定到声明的构造函数BST()
,如果找不到,则会引发错误。< / p>