【问题标题】:Can I declare a string in a header file in a definition of a class? [duplicate]我可以在类定义的头文件中声明一个字符串吗? [复制]
【发布时间】:2011-04-12 23:22:40
【问题描述】:

是否可以在头文件 (.h) 中,在类的定义中声明一个字符串?

当我想设置默认 int 时,我会这样做:

 class MyClass
 {
     static const unsigned int kDATA_IMAGE_WIDTH =  1024;

有没有办法对string 对象做同样的事情?

 class MyClass
 {
      static const string kDEFAULT_FILE_EXTENSION = "png"; // fail

我知道我可以使用#define...

 #define kDEFAULT_FILE_EXTENSION "png"

谢谢

编辑:补充说它在类定义中。更新示例。

【问题讨论】:

  • 您使用的是什么编译器,错误是什么?这对我有用。
  • Xcode(是 gcc 吗?)错误是:error: invalid in-class initialization of static data member of non-integral type 'const std::string'
  • 你确定你在正确的命名空间内。试试 std::string。你在课堂上这样做吗?
  • @Ross:嗯,是在上课吗?在课堂上使该陈述大不相同(并且无效)。在类定义之外它很好。
  • 嗯...不建议在头文件中声明这样的变量。

标签: c++


【解决方案1】:

根据您给出的错误消息(强调我的):

错误:类内初始化非整数类型'const std::string'的静态数据成员无效

您可以在头文件中执行此操作,但不能在类中执行此操作。

即:

class MyClass
{
    static const std::string invalid = "something";
};

无效,但是

static const std::string valid = "something else";

有效。

如果您希望静态只是该类的成员,您可以这样做:

//Header
class MyClass
{
    static const std::string valid;
};


//Implementation (.cpp) file

const std::string MyClass::valid = "something else again";

只有 static const integral 类变量可以使用“= constant”语法进行初始化。

【讨论】:

  • 抱歉,它在类定义中。我已经更新了我的问题。谢谢
  • @Ross:那么我的答案不会改变。 ;) 最后一个代码框告诉您如何正确执行此操作。
  • 我必须从实现 (.cpp) 文件中删除 static 关键字。
【解决方案2】:

是的,但字符串不是 C++ 固有的。你需要正确的#include

#include <string>

static const std::string kDEFAULT_FILE_EXTENSION = "png";

附带说明。我从未见过 C++ 代码使用 k 前缀来表示常量。我认为这是一个 Objective-C 约定。此外,ALL_CAPS 符号应该真正保留给#define 宏,而不是语言常量。

【讨论】:

  • 嗯,谢谢,但对我不起作用?...:error: invalid in-class initialization of static data member of non-integral type 'const std::string'
  • 我没有意识到你试图在课堂上这样做。
  • 抱歉......我的经验不足,我应该提到它。
  • 感谢您提供的额外信息,这太棒了。我正在从 Obj-C 转向 C++。
  • C++ 常量变量上的“k”前缀是Google C++ style guide的一部分
【解决方案3】:

是的,您应该能够在头文件中声明字符串或放置任何其他类型的代码。它可能会失败,因为头文件缺少定义字符串的#include,或者如果您没有在头文件中“使用命名空间std”,则需要在其前面放置一个“std::”。

如果这些建议不能解决问题,请使用您看到的特定编译器错误更新您的问题。希望这会有所帮助。

【讨论】:

    【解决方案4】:

    我没有这里的上下文,但是如果打算定义一个不可变的以 '\0' 结尾的字符数组,为什么不使用:

    static const char kDEFAULT_FILE_EXTENSION[] = "png";

    另外,请注意,在不调用 string::c_str() 的情况下,字符串类和 const char * 之间没有透明的转换..

    【讨论】:

      【解决方案5】:

      两个选择:

      在头部定义一个静态函数,返回你想要的字符串。

      static std::string kDEFAULT_FILE_EXTENSION()
          {
              return "png";
          }
      

      宏会在这里做正确的事

      #define STATIC_STRING_IN_HEADER(name,value) static std::string name(){return value;}
      STATIC_STRING_IN_HEADER(kDEFAULT_FILE_EXTENSION,"png")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多