关于c ++:如何在头文件中定义const static std :: string?

How can you define const static std::string in header file?

我有一个类,我想存储一个静态std::string,它要么是真正的const,要么是通过getter有效地const。

我试过几种直接的方法1。

1
const static std::string foo ="bar";

代码>

2.

1
2
3
4
5
const extern std::string foo; //defined at the bottom of the header like so
...//remaining code in header
};  //close header class declaration
std::string MyClass::foo ="bar"
/#endif // MYCLASS_H

代码>

我也试过了

3.

1
2
3
4
protected:
    static std::string foo;
public:
    static std::string getFoo() { return foo; }

代码>

这些方法因这些原因分别失败:

  • 错误:在非文本类型的静态数据成员const string MyClass::foo的类初始化中
  • foo指定的存储类——它似乎不喜欢将externconststatic结合起来。
  • 我的代码的其他部分甚至getter函数的返回行生成的许多"未定义引用"错误
  • 我希望在头文件而不是源文件中包含声明的原因。这是一个将被扩展的类,它的所有其他函数都是纯虚拟的,所以目前除了这些变量之外,我没有其他的理由拥有一个源文件。

    那么,如何做到这一点呢?


    一种方法是定义一个方法,该方法内部有一个静态变量。

    例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class YourClass
    {
    public:

        // Other stuff...

        const std::string& GetString()
        {
            // Initialize the static variable
            static std::string foo("bar");
            return foo;
        }

        // Other stuff...
    };

    这将只初始化静态字符串一次,对函数的每次调用都将返回对变量的常量引用。对你的目的有用。


    只能在整数类型的构造函数中初始化静态常量值,而不能初始化其他类型。

    将声明放在标题中:

    1
    const static std::string foo;

    并将定义放在.cpp文件中。

    1
    const std::string classname::foo ="bar";

    如果初始化在头文件中,则包含头文件的每个文件都将具有静态成员的定义。当初始化变量的代码将在多个.cpp文件中定义时,将出现链接器错误。