我是第一个C ++课程的编程学生,对于我最近的一个项目,我无法像在C#中那样创建一个字符串数组:
string MONTHS[ARRAY_CAPACITY] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" };
// this yields many compiler errors in C++
是否有可能在C ++中做类似的事情?
谢谢!
答案 0 :(得分:15)
如果在C ++中初始化数组,那么它不需要设置大小(虽然它会接受一个),所以:
std::string months[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" };
为我编译g ++,我希望它也可以在其他地方编译。我希望您的错误是由于缺少std::
命名空间。
答案 1 :(得分:6)
是的,确实如此:
#include <string>
int main(void)
{
static const size_t Capacity = 12;
std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April", "May",
"June", "July", "Aug", "Sep", "Oct",
"Nov", "Dec" };
}
您的错误可能与其他内容有关。你还记得使用std::
吗?不知道,它可能是任何东西。 Capacity
大小错误了吗?等
请注意,您的代码实际上不是常量数组。这是:
#include <string>
int main(void)
{
static const size_t Capacity = 12;
static const std::string Months[Capacity] = { "Jan", "Feb", "Mar", "April",
/* ^^^^^^^^^^^^ */ "May", "June", "July", "Aug",
"Sep", "Oct", "Nov", "Dec" };
}
此外,您实际上并不需要Capacity
,正如其他人会显示的那样,如果您愿意,可以使用const char*
,但您会失去{{ 1}} interface。
答案 2 :(得分:2)
常量字符串数组的首选方法可能是一个cstrings数组,
const char* MONTHS[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July",
"Aug", "Sep", "Oct", "Nov", "Dec" };
但是,它也可以用std :: strings,
完成const string MONTHS[] = { string("Jan"), string("Feb"), ... };
当您使用花括号初始化数组时,某些编译器可能不允许从char *到std :: string的隐式转换;显式分配从char *构造的std :: string将修复它。
答案 3 :(得分:0)
是。您在问题中使用的语法是正确的,只要编译器理解string
是std::string
并且只要{}
之间的初始值设定项的数量不超过ARRAY_CAPACITY
}。
当然,如果您想要一个常量数组,正如标题所示,您应该将其声明为const
。没有const
,如果将数组放入包含在多个翻译单元中的头文件中,则数组将具有外部链接并导致链接器错误。
const std::string MONTHS[ARRAY_CAPACITY] = { "Jan", /* and so on ... */ };
答案 4 :(得分:0)
是的,Visual C ++支持它 - 我刚刚做了类似的事情。不确定其他版本的C ++。
你是否包括图书馆? ARRAY_CAPACITY的定义是什么?
当你说“无法”时,你的意思是你有编译器/链接器错误或其他什么?你能提供更多细节吗?
答案 5 :(得分:0)
我假设您要使用std :: string,但在C ++中这是不可能的。或者至少不是这么简单。 您可以使用而不是std :: string来简单 const char * MONTH [ARRAY_CAPACITY] = {“Jan”,...}; 这可能已经成功了。
如果你真的想使用std :: string,你可能想看一下STL容器和boost库(www.boost.org)。特别是boost :: assign,它可以像你想要的那样做类似的东西。
此致 迈克尔