如何在头文件中定义const static std :: string?

时间:2013-08-01 00:53:55

标签: c++ static header const

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

我尝试了几种直接的方法  1.

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

2

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

protected:
    static std::string foo;
public:
    static std::string getFoo() { return foo; }

这些方法分别因以下原因而失败:

  1. 错误:非文字类型
  2. 的静态数据成员const string MyClass::foo的类内初始化
  3. foo指定的存储类 - 它似乎不希望将externconststatic
  4. 合并
  5. 许多'未定义的引用'我的代码的其他部分生成的错误,甚至是getter函数的返回行
  6. 原因我想在标题中而不是源文件中声明。这是一个将被扩展的类,它的所有其他函数都是纯虚拟的,所以我目前没有其他理由比这些变量有源文件。

    那怎么办呢?

2 个答案:

答案 0 :(得分:15)

一种方法是定义一个在其中包含静态变量的方法。

例如:

class YourClass
{
public:

    // Other stuff...

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

    // Other stuff...
};

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

答案 1 :(得分:12)

您只能在构造函数中为整数类型初始化静态const值,而不是其他类型。

将声明放在标题中:

const static std::string foo;

将定义放在.cpp文件中。

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

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