C ++类公共字符串常量

时间:2009-06-07 22:02:02

标签: c++ c++11

在C ++中,我想定义一些将在类中使用的字符串,但这些值在所有实例中都是通用的。在C中我会使用#define s。这是一次尝试:

#include <string>
class AskBase {
public:
    AskBase(){}
private:
    static std::string const c_REQ_ROOT = "^Z";
    static std::string const c_REQ_PREVIOUS = "^";
    static std::string const c_REQ_VERSION = "?v";
    static std::string const c_REQ_HELP = "?";
    static std::string const c_HELP_MSG = "  ? - Help\n ?v - Version\n ^^ - Root\n  ^ - Previous\n ^Z - Exit";
};
int main(){AskBase a,b;}

如果需要可接受的C ++ 0x。

4 个答案:

答案 0 :(得分:10)

您必须在单个翻译单元(源文件)中单独定义它们,如下所示:

//header
class SomeClass
{
  static const std::string someString;
};

//source
const std::string SomeClass::someString = "value";

我相信新的C ++ 1x标准会解决这个问题,但我并不完全确定。

答案 1 :(得分:2)

当我需要一个类中的字符串常量时,我​​从不将它们放在类本身中,而是:

1)如果需要在标题中公开它们,我将它们放在类之外(如果合适的话,在命名空间中),如下所示:

const char * const c_REQ_ROOT = "^Z";
...

2)如果没有,我将它们放在匿名命名空间中的cpp文件中。

然后,您甚至可以从同一个头文件中的几个相关组件对字符串进行常量分组。

它可能不是最“学术”的方式,但代码更简单,更容易重构。我从未发现将字符串常量定义为静态类成员的任何实际优势。

我对其他程序员的意见非常感兴趣,所以不要犹豫,留下你的意见。

答案 2 :(得分:0)

我永远不会使用那种结构 如果其中一个开发人员重构代码并开始编写:

   // header
   class StringBug
   {
        static const std::string partOfTheString;
        static const std::string wholeString;
   };

   // source
   const std::string StringBug::partOfTheString = "Begin ";
   const std::string StringBug::wholeString = partOfTheString + "and the rest";

你在程序中很难找到错误,因为在用于创建wholeString之前没有初始化partOfTheString的garante;

如果我想创建类公共字符串,我就这样做:

// header
class StringBug
{
    static const std::string& partOfTheString() {
       static const std::string sPartOfTheString("Begin ");
       return sPartOfTheString;      
    }

    static const std::string& wholeString() {
       static const std::string sWholeString( partOfTheString() + "and the rest");
       return sWholeString;
    }
};

答案 3 :(得分:0)

根据Wikipedia articleC++0x应支持此功能但我无法在State of C++ Evolution页面中找到该引用。