2

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

#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

4 回答 4

10

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

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

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

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

于 2009-06-07T22:04:59.553 回答
2

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

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

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

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

然后,您甚至可以将来自多个相关组件的字符串常量分组到同一个头文件中。

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

我对这里其他程序员的意见很感兴趣,所以不要犹豫,留下你的评论。

于 2009-06-08T08:35:00.800 回答
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";

您很难在程序中找到错误,因为没有保证 partOfTheString 在用于创建 WholeString 之前已初始化;

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

// 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;
    }
};
于 2009-06-08T07:52:36.063 回答
0

根据Wikipedia 文章,这应该得到支持,但是我在State of C++ Evolution页面C++0x中找不到参考。

于 2009-06-08T08:34:00.070 回答