17

我有一个类,我想存储一个静态std::string的,它要么是真正的 const,要么是通过 getter 有效的 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. 错误:静态数据成员的类内初始化const string MyClass::foo错误:非文字类型
  2. 指定的存储类foo-- 它似乎不喜欢externconstor组合static
  3. 我的代码的其他部分甚至 getter 函数的返回行生成了许多“未定义的引用”错误

我希望在标头而不是源文件中声明的原因。这是一个将被扩展的类,它的所有其他功能都是纯虚拟的,所以我目前除了这些变量之外没有其他理由拥有源文件。

那么如何做到这一点呢?

4

2 回答 2

18

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

例如:

class YourClass
{
public:

    // Other stuff...

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

    // Other stuff...
};

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

于 2013-08-01T01:05:47.943 回答
14

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

将声明放在标题中:

const static std::string foo;

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

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

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

于 2013-08-01T01:00:33.170 回答