Ссылочный вектор не проходит через функции - PullRequest
2 голосов
/ 11 мая 2010

Вектор, на который ссылаются функции, не хранит информацию в памяти. Нужно ли использовать указатели?

Спасибо.

#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;
}

Ответы [ 5 ]

5 голосов
/ 11 мая 2010

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

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

4 голосов
/ 11 мая 2010

Ваша menu функция рекурсивная.

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

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

1 голос
/ 11 мая 2010

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

0 голосов
/ 11 мая 2010

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

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


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

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

0 голосов
/ 11 мая 2010

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

РЕДАКТИРОВАТЬ: Вы также можете обернуть все это в классе и неоднократно вызывать menu().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...