C++ 引用向量不通过函数

C++ 引用向量不通过函数,c++,vector,reference,C++,Vector,Reference,函数的引用向量不在内存中保存信息。我必须使用指针吗 谢谢 #include <iostream> #include <cstdlib> #include <vector> #include <string> using namespace std; void menu(); void addvector(vector<string>& vec); void subvector(vector<string>&

函数的引用向量不在内存中保存信息。我必须使用指针吗

谢谢

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
无效菜单();
void addvector(vector和vec);
空子向量(向量和向量);
无效向量大小(常量向量和向量);
无效打印向量(常量向量和向量);
无效打印向量(常量向量和向量);
int main()
{
向量向量向量机;
菜单();
返回0;
}
//函数定义
无效菜单()
{
向量向量向量机;
int-choice=0;

CUT< P>您需要要么是<代码> sValue/Cuth>是全局的(在任何函数之外声明),要么作为参数传递给<代码>菜单< /C> > C++没有动态范围。
编辑:您还可以将所有这些都封装在一个类中,并反复调用
menu()

您的问题是,每次调用menu()都会创建一个新的向量,该向量会隐藏上一个向量,这就是为什么您觉得它们是空的。如果您确实希望递归调用menu(),请将在main中创建的向量引用传递给它


尽管如此,菜单系统很少是递归的。您可能希望在main中围绕对menu()的调用进行循环,直到用户选择退出。

您的
菜单
函数是递归的

这意味着对
菜单
的每次新调用都将创建自己的
向量
,完成后将其丢弃


如果要重用
svector
,您需要对菜单使用普通循环,或者使用pass by reference参数将在
main
中创建的原始
svector
传递到
菜单

问题是调用另一个
菜单()
,它在堆栈上分配新的
svector
(在记忆的某些部分)。
可能的原始代码是“代码>空菜单(vector和svector)< /> > < /p> <代码> sVector 共享(是什么代码<代码>代码>?),在C++中不同范围之间共享的变量必须声明为代码> ExtXN/COD>,或者您得到两个独立的局部变量。
int main()
{
    extern vector<string> svector;
    …


void menu()
{
    extern vector<string> svector;
    …
intmain()
{
外向量向量向量;
…
无效菜单()
{
外向量向量向量;
…

只是开玩笑。
svector
应该是一个参数。或者一个全局变量就足够了。但是不要像这样使用全局变量。

(请注意:递归
菜单可能不是一个好主意……)不可以。您可以在堆栈上传递对本地对象的引用。问题是递归,每次调用菜单时都会创建一个新的svector副本。@xtofl,在语义未知的情况下,给出好/坏的实现建议是没有帮助的。当然,一般来说,全局变量不是一个好主意,但在这种情况下,使用这样一个rivial程序,没关系。显然,我对动态范围的评论没有被任何人接受。清楚的解释。不过,作为一个挑剔的人,我忍不住反对“隐藏”这个术语。新向量没有隐藏任何东西,是前一个堆栈帧丢失了。前一个堆栈帧没有丢失,只是被忽略了…H这不是隐藏吗?标识符暂时绑定到另一个对象,导致了关于它应该是空的混淆…我觉得我很酷,提出了递归。谢谢。@kylepayne:递归是解决较小子问题的一个很好的工具,但不是银弹。如果一个自然的描述任务的选择(例如,在退出之前选择菜单)不适合递归,这可能不是一个很好的匹配。