为什么静态变量需要在C ++中声明两次

时间:2011-08-06 15:12:42

标签: c++ class variables static

我有一个名为 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_;
}

这有效,但我不明白为什么。

为什么需要将这些静态变量定义两次?或者也许我不是定义它们而是初始化它们?但仍然为什么需要这样做呢?或者我应该以不同的方式写我的课程?

4 个答案:

答案 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;'那样完成是可能的 在类声明预留空间中为他们提供第二次声明,&必须让它意识到它