我有一个名为 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_;
}
这有效,但我不明白为什么。
为什么需要将这些静态变量定义两次?或者也许我不是定义它们而是初始化它们?但仍然为什么需要这样做呢?或者我应该以不同的方式写我的课程?
答案 0 :(得分:9)
一个是定义,另一个是声明。不同之处在于声明可以多次出现,对于不在类中的变量,可能永远不会出现,而定义只能出现一次。
需要单独的声明和定义的原因是古老的历史,它基本上不必那样的东西,但它是这样的,以便C ++与C兼容,C被设计为编译于20世纪70年代。
答案 1 :(得分:2)
来自http://weblogs.asp.net/whaggard/archive/2004/11/05/252685.aspx:
你需要在类之外声明它,否则编译器不知道该成员应该去哪个翻译单元(因此是对象文件)。
因为,像DeadMG所说,你可以多次声明一个变量,但只定义一次。我认为这就像函数原型:你可以拥有你想要的那么多,但只有一个可以与一个主体一起实际定义函数。
答案 2 :(得分:0)
你没有声明它们两次,声明发生在类头中,定义 - 变量实际存在的点并将分配一些内存 - 位于.cpp部分。
但是与普通实例变量的区别在于,对于您创建的任何实例,静态部分每个类只有一次。
答案 3 :(得分:0)
这是因为,当你声明一个类时,你正在声明该类的特定实例的结构,但是对于类中的静态变量,它们是可以在任何对象之前初始化的结构。该类已创建。 当我们在内存中声明一个类时,没有保留空间,但是当我们声明类的对象时,空间是保留的。类的成员可以像 int a = 2;但这可以像'static int a = 2;'那样完成是可能的 在类声明预留空间中为他们提供第二次声明,&必须让它意识到它