Поддерживает ли С++ постоянные массивы типа string?
Я участвую в программировании в моем первом классе С++, и для недавнего проекта, который я сделал, мне не удалось создать массив строк, как я мог бы сделать в С#:
string MONTHS[ARRAY_CAPACITY] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" };
// this yields many compiler errors in C++
Возможно ли сделать что-то подобное в С++?
Спасибо!
Ответы
Ответ 1
Если вы инициализируете массив в С++, тогда он не требует установки размера (хотя он примет его), поэтому:
std::string months[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec" };
компилируется отлично с g++ для меня, и я ожидаю, что он будет компилироваться и в другом месте. Я ожидаю, что ваши ошибки связаны с отсутствием пространства имен std::
.
Ответ 2
Да, это делает:
#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
неправильный размер? Etc.
Обратите внимание, что ваш код не был фактически постоянным массивом. Это:
#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*
, если хотите, хотя вы потеряете интерфейс std::string
.
Ответ 3
Предпочтительным методом для массива константных строк будет, вероятно, массив cstrings,
const char* MONTHS[] = { "Jan", "Feb", "Mar", "April", "May", "June", "July",
"Aug", "Sep", "Oct", "Nov", "Dec" };
Однако это также можно сделать с помощью std:: stringings,
const string MONTHS[] = { string("Jan"), string("Feb"), ... };
Некоторые компиляторы могут не допускать неявное преобразование из char * в std::string при инициализации массива с фигурными фигурными скобками; явно назначая std::string, построенный из char *, исправит это.
Ответ 4
Да. Синтаксис, который вы использовали в вопросе, верен, если компилятор понимает, что string
есть std::string
и до тех пор, пока количество инициализаторов между {}
не превышает ARRAY_CAPACITY
.
Конечно, если вы хотите иметь постоянный массив, как следует из названия, вы должны были объявить его const
. Без const
ваш массив будет иметь внешнюю связь и вызовет ошибки компоновщика, если вы поместите его в файл заголовка, включенный в несколько единиц перевода.
const std::string MONTHS[ARRAY_CAPACITY] = { "Jan", /* and so on ... */ };
Ответ 5
Да, Visual С++ поддерживает его - я только что сделал что-то подобное. Не уверен в других версиях С++.
Вы включили библиотеку? Каково определение ARRAY_CAPACITY?
Когда вы говорите "невозможно", вы имеете в виду, что у вас были ошибки компилятора/компоновщика или что-то еще? Можете ли вы предоставить более подробную информацию?
Ответ 6
Я предполагаю, что вы хотите использовать std::string, но на С++ это невозможно. Или, по крайней мере, не так просто.
Вместо std::string можно использовать простой
const char * MONTH [ARRAY_CAPACITY] = { "Jan",...};
Это может уже сделать трюк.
Если вы действительно хотите использовать std::string, вы можете взглянуть на контейнер STL и библиотеку boost (www.boost.org). Особенно boost:: assign, который может сделать что-то подобное, как вы хотите.
С уважением,
Майкл