2010-05-11 4 views
2

Указанный вектор функций не содержит информацию в памяти. Должен ли я использовать указатели?Указанный вектор не проходит через функции

Спасибо.

#include <iostream> 
#include <cstdlib> 
#include <vector> 
#include <string> 

using namespace std; 

void menu(); 
void addvector(vector<string>& vec); 
void subvector(vector<string>& vec); 
void vectorsize(const vector<string>& vec); 
void printvec(const vector<string>& vec); 
void printvec_bw(const vector<string>& vec); 

int main() 
{ 
    vector<string> svector; 

    menu(); 

    return 0; 
} 
//functions definitions 

void menu() 
{ 
    vector<string> svector; 
    int choice = 0; 

     cout << "Thanks for using this program! \n" 
      << "Enter 1 to add a string to the vector \n" 
      << "Enter 2 to remove the last string from the vector \n" 
      << "Enter 3 to print the vector size \n" 
      << "Enter 4 to print the contents of the vector \n" 
      << "Enter 5 ----------------------------------- backwards \n" 
      << "Enter 6 to end the program \n"; 
     cin >> choice; 

     switch(choice) 
     { 

       case 1: 
        addvector(svector); 
        menu(); 
        break; 
       case 2: 
        subvector(svector); 
        menu(); 
        break; 
       case 3: 
        vectorsize(svector); 
        menu(); 
        break; 
       case 4: 
        printvec(svector); 
        menu(); 
        break; 
       case 5: 
        printvec_bw(svector); 
        menu(); 
        break; 
       case 6: 
        exit(1); 
       default: 
        cout << "not a valid choice \n"; 

      // menu is structured so that all other functions are called from it. 
     } 

} 

void addvector(vector<string>& vec) 
{ 
    //string line; 

    //int i = 0; 
     //cin.ignore(1, '\n'); 
     //cout << "Enter the string please \n"; 
     //getline(cin, line); 
     vec.push_back("the police man's beard is half-constructed");  

} 

void subvector(vector<string>& vec) 
{ 
    vec.pop_back(); 
    return; 
} 

void vectorsize(const vector<string>& vec) 
{ 
    if (vec.empty()) 
    { 
     cout << "vector is empty"; 
    } 
    else 
    { 
     cout << vec.size() << endl; 
    } 
    return; 
} 

void printvec(const vector<string>& vec) 
{ 
    for(int i = 0; i < vec.size(); i++) 
    { 
     cout << vec[i] << endl; 
    } 

    return; 
} 

void printvec_bw(const vector<string>& vec) 
{ 
    for(int i = vec.size(); i > 0; i--) 
    { 
     cout << vec[i] << endl; 
    } 

    return; 
} 
+6

(только упоминание: рекурсия «меню» может быть не очень хорошая идея ...) – xtofl

ответ

0

Вам нужно либо иметь svector быть глобальным (объявленная вне любой функции), либо передать его в качестве параметра menu. C++ не имеет динамических возможностей для функций.

EDIT: Вы можете также обернуть все это в классе и повторно позвонить menu().

+1

ouch ... не советую идти глобально ... – xtofl

+0

Nope. Вы можете передать ссылку на локальный объект в стеке. Проблема заключается в рекурсии, которая создает новую копию svector при каждом вызове меню. –

+0

@xtofl, давая советы о хорошей/плохой реализации, не помогает, когда семантика даже не известна. Конечно, глобальная переменная вообще не была бы хорошей идеей, но в этом случае с такой тривиальной программой это не имеет значения. И, судя по всему, мой комментарий о динамической области не регистрировался ни с кем. – MSN

5

Ваша проблема в том, что каждый вызов меню() создает новый вектор, который скрывает предыдущий, поэтому вам кажется, что они пустые. Если вы действительно хотите рекурсивно вызывать меню, передайте ему векторную ссылку, которую вы создали в основном.

Все, что называется, системы меню редко бывают рекурсивными. Вероятно, вам понадобится цикл вокруг вашего вызова в меню() в главном цикле, пока пользователь не остановится.

+0

Очистить пояснения. Тем не менее, я не могу противостоять возражению против термина «укрытие». Новый вектор ничего не скрывает, это предыдущий стек стека, который потерян. – xtofl

+0

Предыдущий стек кадров не потерян, его просто игнорируют ... – Potatoswatter

+0

Как это не скрывается?Идентификатор временно привязан к другому объекту, в результате чего путаница вокруг него якобы пуста – Uri

4

Функция menu рекурсивна.

Это означает, что каждый новый звонок menu создаст его собственный vector и выбросит его, когда все будет готово.

Если вы хотите повторно использовать svector, вам необходимо либо использовать простой цикл для меню, или передать исходный svector, созданный в main, к menu с помощью пропускания по ссылке аргумента.

1

Проблема в том, что вы вызываете другой menu(), который выделяет новый svector на стек (в некоторой части памяти). Вероятно, исходный код был void menu(vector<string>&svector)

0

svector разделяется (это то, что s означает?), И переменные, которые являются общими между различными областями в C++ должны быть объявлены extern, или вы получите две отдельные локальные переменные.

int main() 
{ 
    extern vector<string> svector; 
    … 


void menu() 
{ 
    extern vector<string> svector; 
    … 

Просто шучу. svector должен быть аргументом. Или глобального хватит. Но не используйте такие глобальные переменные.

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