2013-05-22 2 views
0

Я попробовал код ниже, чтобы вернуть массив со всеми идентификаторами строк, но это не сработало. Результат просто возвращает число. Как я могу вернуть массив с идентификаторами?Возвращаемый массив из функции в C++

#include <iostream> 
#include <string> 
using namespace std; 

string* getArray() 
{ 
    int nanim; 
cout << "Enter the number of animals: "; 
cin >> nanim; 

string *id = new string[nanim]; 
for (size_t i=0; i < nanim; i++) 
{ 
    cout<< "\nEnter id anim "<< i+1 << ": "; 
    cin >> id[i]; 
    } 
    for (size_t i = 0; i < nanim; i++) 
    { 
    cout << id[i] << endl; 
    } 
return id; 
} 

    int main() 
{ 
int n; 
cin>>n; 
    string* anim[n]=getArray(); 
cout<<anim; 
return 0; 
} 
+3

Вы не возвращаете массив, вы возвращаете указатель на первый элемент массива. Вам будет намного лучше использовать 'std :: vector'. – chris

+0

Вы не можете возвращать массивы из функций (или передавать массивы в функции). Вот и все. –

+1

Конечно, вы можете, вы просто не можете знать длину. – Joel

ответ

4

Вы возвращаете указатель на первый элемент массива.

Для доступа к элементам массива, только что вызвавшим string* arr = getArray();, вы можете использовать arr [0], arr [1], arr [2] и т. Д. Для доступа к строкам.

Не забудьте удалить память, которую вы выделили в функции; на данный момент у вас большая утечка памяти.

Как правило, это не очень хорошее программирование, хотя, поскольку вызывающий объект не знает, сколько элементов есть в возвращаемом массиве. Было бы лучше получить количество животных в вызывающем и передать это в вашу функцию.

Лучше еще, перестройте свой код, чтобы использовать std :: vector, поскольку я вижу, что вы уже используете stl. Тогда вам не нужно беспокоиться (явно) о распределении памяти и освобождении.

+1

+1. Кроме того, я предлагаю передать n в getArray() в качестве параметра и выполнить некоторую проверку работоспособности. – AlexK

+2

Хорошая точка AlexK +1. Лично мне также не нравится код, который выделяет память в функции, и это задача вызывающего, чтобы освободить ее. – Bathsheba

3

Вам не нужно считывать количество элементов дважды, а тип anim должен быть string*, а не string* []. К сожалению, это не сказать вам количество элементов в массиве, так что вам нужно, чтобы получить его из getArray, например, так:

string* getArray(int& nanim) { 
    // Remove the declaration of nanim, and keep the rest of the code unchanged 
    ... 
} 

int main() 
{ 
    int n; 
    string* anim = getArray(n); 
    for (int i=0; i != n; i++) { 
     cout << anim[i] << endl; 
    } 
    delete[] anim; 
    return 0; 
} 

Это не является оптимальным C++ решение, хотя: вы было бы намного лучше использовать std::vector вместо массива, потому что вектор динамически растет, а его размер возвращается вместе с самим контейнером. Там не было бы никакой необходимости delete[] результата либо, что позволил бы существенно упростить код:

#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

vector<string> getVector() 
{ 
    int nanim; 
    cout << "Enter the number of animals: "; 
    cin >> nanim; 
    vector<string> res; 
    for (size_t i=0; i < nanim; i++) 
    { 
     cout<< "\nEnter id anim "<< i+1 << ": "; 
     string tmp; 
     cin >> tmp; 
     res.push_back(tmp); 
    } 
    return res; 
} 

int main() 
{ 
    vector<string> anim = getVector(); 
    for (size_t i = 0; i < anim.size(); i++) 
    { 
     cout << anim[i] << endl; 
    } 
    return 0; 
} 
+0

+1 для использования вектор. – Joel

+0

Как это сделать с помощью вектора? – user2386222

+0

@ user2386222 Посмотрите на редактирование. Вот тот же код, который работает на ideone: [link] (http://ideone.com/2xct7B). – dasblinkenlight

Смежные вопросы