我有一个叫头filepaths.h它定义了一些静态变量:为什么静态变量需要在C++中声明两次
#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_;
}
而这个工作,但是我不明白为什么。
为什么这些静态变量需要定义两次?或者,也许我没有定义他们,但初始化他们?但仍然为什么需要这样做?还是应该以不同的方式写我的课程?
我不认为这是古老的。声明声称“存在某个名为X的变量/类/函数”,而定义说“X驻留在这里,编译器请为它分配存储空间”。分离声明和定义的能力是允许多种翻译单元采用静态类型的语言,而编译器不需要过度“聪明”并猜测自己的意图。 – vsekhar
这并不是很陈旧,因为这两个标准(甚至现在,C99/C++ 11)在实际的链接器进程上都非常模糊,并且某个cpp文件中的定义将导致生成的目标文件中有一个定义,如果这并非如此,链接器在将所有代码链接在一起时不会找到唯一的引用。 – rubenvb
vsekhar,@rubenvb:我会注意到,对于模板代码,我们获得了函数和静态属性的多个定义(在对象文件中),但链接器管理它们是正确的。 –