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

时间:2017-01-19 23:29:49

标签: c++ eclipse global-variables

我在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();

1 个答案:

答案 0 :(得分:0)

我认为&#34;未定义的引用错误&#34;是链接器错误,表示缺少已声明方法的实现。在这种情况下,声明了构造函数BST(),但未实现。只是尝试一下,如果您输入BST() {}而不是BST();,它应该有效。

所以这实际上不是&#34;在错误的地方声明一个全局变量&#34 ;;如果声明形式为BST *tree = new BST()的全局变量,编译器将检查BST是否声明了相应的构造函数(显式或隐式);并且这样的构造函数是显式声明的,因此编译器不会引发任何错误。但是,由于现在在代码中引用了构造函数BST(),链接器必须将实现绑定到声明的构造函数BST(),如果找不到,则会引发错误。< / p>