是否可以在类的定义中在标题(.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"
感谢
编辑:添加它在类定义中。更新的例子。
答案 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")