我可以在类的定义中的头文件中声明一个字符串吗?

时间:2010-09-16 00:04:59

标签: c++

是否可以在类的定义中在标题(.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"

感谢

编辑:添加它在类定义中。更新的例子。

5 个答案:

答案 0 :(得分:12)

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

  

错误:非整数类型'const std :: string'

的静态数据成员的 in-class 初始化无效

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

那是:

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

无效,但

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

有效。

如果您希望static只是该类的成员,请执行以下操作:

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


//Implementation (.cpp) file

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

只能使用“= 常量”语法初始化 static const integral 类变量。

答案 1 :(得分:1)

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

#include <string>

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

旁注。我从未见过C ++代码使用k前缀来表示常量。我认为这是一个Objective-C惯例。此外,ALL_CAPS符号实际上应该保留给#define宏,而不是语言常量。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

static const char kDEFAULT_FILE_EXTENSION [] =“png”;

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

答案 4 :(得分:0)

两种选择:

在标题中定义一个静态的函数并返回所需的字符串。

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")