Возвращаемый массив строк в функции С++
Я новичок в С++.
Для школьного проекта мне нужно создать функцию, которая сможет вернуть строковый массив.
В настоящее время у меня это в моем заголовке:
config.h
string[] getVehicles(void);
Config.cpp
string[] Config::getVehicles(){
string test[5];
test[0] = "test0";
test[1] = "test1";
test[2] = "test2";
test[3] = "test3";
test[4] = "test4";
return test;}
Очевидно, это не работает, но идея о том, что я пытаюсь сделать.
В Java это будет способ сделать это. Я попытался разобраться с моей проблемой, но я не нашел ответов, которые были ясны, если честно.
Ответы
Ответ 1
Может быть, лучше использовать вектор в этом случае, но это не правильный ответ на вопрос. Причина, по которой он не работает, заключается в том, что переменная-тест существует только в области вашей функции.
Таким образом, вам нужно управлять памятью самостоятельно. Вот пример:
string* getNames() {
string* names = new string[3];
names[0] = "Simon";
names[1] = "Peter";
names[2] = "Dave";
return names;
}
В этом случае вы возвращаете указатель положения в куче. Вся память в куче должна освободиться вручную. Итак, теперь ваша работа заключается в том, чтобы удалить память, если она вам больше не нужна:
delete[] names;
Ответ 2
В С++ вы не используете массив, а экземпляр std::vector
. Массивы в С++ должны иметь фиксированную длину времени компиляции, а экземпляры std::vector
могут изменять свою длину во время выполнения.
std::vector<std::string> Config::getVehicles()
{
std::vector<std::string> test(5);
test[0] = "test0";
test[1] = "test1";
test[2] = "test2";
test[3] = "test3";
test[4] = "test4";
return test;
}
std::vector
также может динамически расти, поэтому в программе на С++ вы найдете более часто что-то вроде
std::vector<std::string> Config::getVehicles()
{
std::vector<std::string> test; // Empty on creation
test.push_back("test0"); // Adds an element
test.push_back("test1");
test.push_back("test2");
test.push_back("test3");
test.push_back("test4");
return test;
}
Динамическое распределение массива std::string
технически возможно, но ужасная идея в С++ (например, С++ не предоставляет сборщик мусора, который имеет Java).
Если вы хотите запрограммировать на С++, тогда возьмите хорошую книгу на С++ и прочитайте ее обложку для обложки... написать Java-код в С++ - это рецепт для потому что языки, несмотря на сходство поверхностных скобок, очень сильно различаются по многим основным причинам.
Ответ 3
Используйте std::vector<std::string>
. Намного легче справиться с массивами C
-style.
#include <string>
#include <vector>
...
std::vector<std::string> Config::getVehicles()
{
std::vector<std::string> data;
data.push_back("hello");
...
return data;
}
Проверьте другие контейнеры в стандартной библиотеке, они почти всегда являются лучшим выбором, чем простые массивы в С++.
Если ваш метод getVehicles
не изменяет состояние объекта Config
, рассмотрите его const
:
std::vector<std::string> Config::getVehicles() const { ... }