即使在定义类后也无法在C++中声明全局变量?
Can't declare global variable in C++ even after defining the class?
我在 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()
,如果找不到,它将引发错误。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别