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

lau*_*ent 7 c++ variables static class

我有一个名为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
Run Code Online (Sandbox Code Playgroud)

我有一个关联的filepaths.cpp,最初看起来像这样:

#include "FilePaths.h"

QString FilePaths::dataFolder() {
    return dataFolder_;
}

QString FilePaths::profileFolder() {
    return profileFolder_;
}
Run Code Online (Sandbox Code Playgroud)

但是这不起作用 - 我在所有静态变量上得到了一个"未解决的符号错误"链接器错误.所以我以这种方式将这些变量添加到C++文件中:

#include "FilePaths.h"

QString FilePaths::dataFolder_ = "";
QString FilePaths::profileFolder_ = "";

QString FilePaths::dataFolder() {
    return dataFolder_;
}

QString FilePaths::profileFolder() {
    return profileFolder_;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Pup*_*ppy 9

一个是定义,另一个是声明.不同之处在于声明可以多次出现,对于不在类中的变量,可能永远不会出现,而定义只能出现一次.

需要单独的声明和定义的原因是古老的历史,它基本上不必那样的东西,但它是这样的,以便C++与C兼容,C被设计为在20世纪70年代.

  • 我不认为这是古老的.声明说"存在一个名为X的变量/类/函数",而定义说"X驻留在这里,编译器请为它分配存储".分离声明和定义的能力允许使用静态类型语言的多个翻译单元,而编译器不需要过度"智能"并猜测您的意图. (3认同)
  • 这很古老,因为程序员根本不需要处理它.几乎所有其他编译语言都不需要这种系统,并且不得不一遍又一遍地重复解析相同的声明是非常慢的. (3认同)