Поддерживает ли С++ постоянные массивы типа 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, который может сделать что-то подобное, как вы хотите.

С уважением, Майкл