【问题标题】:How can you define const static std::string in header file?如何在头文件中定义 const static std::string?
【发布时间】:2013-08-01 18:05:14
【问题描述】:

我有一个类,我想存储一个静态 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 指定的存储类——它似乎不喜欢将externconststatic 结合使用
  3. 我的代码的其他部分甚至 getter 函数的返回行都会产生许多“未定义的引用”错误

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

那么如何做到这一点呢?

【问题讨论】:

标签: c++ static header constants


【解决方案1】:

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

例如:

class YourClass
{
public:

    // Other stuff...

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

    // Other stuff...
};

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

【讨论】:

  • 聪明,只是为了让自己放心,我在 for 循环中调用了这个方法,该循环迭代了 2^32 次,似乎没有内存泄漏。我确实喜欢 billz 关于将这些变量放在另一个命名空间中的观点,但最终这就是我的问题的答案(我确实必须在函数声明中添加静态)。谢谢!
  • 现在自动为我巨大的矢量化字符串映射做同样的事情......哈哈!
【解决方案2】:

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

将声明放在标题中:

const static std::string foo;

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

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

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

【讨论】:

  • 他在他的问题中说他不想要一个实现文件。
  • @ChrisCooper 我注意到了,但我认为这做不到。
  • 哦...我在我正在处理的项目的标题中初始化了const std::string。我没有收到链接器错误...对于 C++11 是否已更改 - 还是我遗漏了什么?
  • 那么您可能只包含该文件一次。
  • Perhaps he was dictating it. 更严重的是@thomthom,您的证词可能很有趣,但如果没有有关您的平台、编译器等的更多详细信息,我们无法提供任何信息。
猜你喜欢
  • 2016-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
相关资源
最近更新 更多