Подтвердить что ты не робот

Возвращаемый массив строк в функции С++

Я новичок в С++. Для школьного проекта мне нужно создать функцию, которая сможет вернуть строковый массив.

В настоящее время у меня это в моем заголовке:

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 это будет способ сделать это. Я попытался разобраться с моей проблемой, но я не нашел ответов, которые были ясны, если честно.

4b9b3361

Ответ 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 { ... }