即使在定义类后也无法在C++中声明全局变量?

Can't declare global variable in C++ even after defining the class?

本文关键字:C++ 声明 全局变量 定义      更新时间:2023-10-16

我在 c++ 中声明数据类型后立即声明全局变量时遇到问题。所以我声明了这个类(注意,这是在另一个.cpp文件中),然后尝试声明变量treeBST *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(),如果找不到,它将引发错误。