为什么静态变量需要在c++中声明两次?
Why do static variables need to be declared twice in C++
我有一个名为filepaths.h的头文件,它定义了一些静态变量:
#ifndef FILEPATHS_H
#define FILEPATHS_H
class FilePaths {
public:
static QString dataFolder();
static QString profileFolder();
private:
static QString dataFolder_;
static QString profileFolder_;
};
}
#endif // FILEPATHS_H
我有一个相关联的filepaths。cpp它最初看起来像这样:
#include "FilePaths.h"
QString FilePaths::dataFolder() {
return dataFolder_;
}
QString FilePaths::profileFolder() {
return profileFolder_;
}
然而,这没有工作-我得到了一个"未解析的符号错误"链接器错误在所有的静态变量。因此,我以这种方式将这些变量添加到c++文件中:
#include "FilePaths.h"
QString FilePaths::dataFolder_ = "";
QString FilePaths::profileFolder_ = "";
QString FilePaths::dataFolder() {
return dataFolder_;
}
QString FilePaths::profileFolder() {
return profileFolder_;
}
这是有效的,但我不明白为什么。
为什么这些静态变量需要定义两次?或者我不是定义它们,而是初始化它们?但是为什么要这么做呢?或者我应该用不同的方式写我的类吗?
一个是定义,另一个是声明。不同之处在于声明可以出现多次,对于不在类中的变量,可能永远不会出现,而定义只能出现一次。
需要单独声明和定义的原因是古老的历史,这种事情基本上根本不必这样做,但这样做是为了使c++与C兼容,C是在20世纪70年代被设计为编译的。
From http://weblogs.asp.net/whaggard/archive/2004/11/05/252685.aspx:
你需要在类外部声明它,否则编译器不知道该成员应该去哪个翻译单元(因此是对象文件)。
因为,就像DeadMG说的,你可以多次声明一个变量,但只定义它一次。我认为这就像函数原型一样:你可以有尽可能多的函数原型,但只有一个可以与主体一起使用并实际定义函数。
您不需要声明它们两次,声明发生在类头文件中,而定义(变量实际存在并将分配一些内存的点)在.cpp部分中。
但是与普通实例变量的区别在于,对于您创建的任何实例,每个类的静态部分只存在一次。
这是因为,当你声明一个类时,你是在为该类的特定实例声明一个结构,但是在类中的静态变量的情况下,它们是可以在创建类的任何对象之前初始化的。当我们在内存中声明一个类时,没有空间保留,但是当我们声明类的对象时,空间是保留的。类的任何成员都不能像这样初始化int = 2;但这可以像'static int a=2;'一样实现在类声明中,在第二个声明&必须意识到这一点
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 为什么对isnan的呼吁并不含糊?a.k.a.关键字使用引入两次相似的函数声明
- 在静态数组声明中使用了两次C++常量
- 两次声明纯虚拟函数(在层次结构中的两个类中)是否完全合法
- 为什么Microsoft在他们的 winnt.h 文件中两次 typedef 声明什么构成 "double" ?
- 在处理模板时,如何避免在函数头和函数体中两次声明相同的类型
- 为什么静态变量需要在c++中声明两次?
- 声明同一个非成员函数两次
- 类构造函数声明了两次