我在 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();
我想"未定义的引用错误"是一个链接器错误,它表明缺少声明方法的实现。在这种情况下,构造函数BST()
被声明,但未实现。只是为了尝试一下,如果您输入BST() {}
而不是BST();
,它应该可以工作。
因此,这实际上不是"在错误的位置声明全局变量"的问题;如果你声明一个形式为 BST *tree = new BST()
的全局变量,编译器将检查BST
是否声明了相应的构造函数(显式或隐式);并且这样的构造函数是显式声明的,因此编译器不会引发任何错误。但是,由于代码中现在引用了构造函数BST()
,链接器必须将实现绑定到声明的构造函数BST()
,如果找不到,它将引发错误。