【问题标题】:Creating a vector in class then using class object in function not working在类中创建一个向量,然后在函数中使用类对象不起作用
【发布时间】:2020-12-02 23:49:12
【问题描述】:

我有一堂课Employees。我试图让用户插入和删除员工,但它不起作用。向量的大小应为 500。

class Employees{
public:
    int maxx = 500;
    vector<string> Surname;
    vector<string> FirstName;
    vector<string> birthdate;
    int vacation[500];
public:
    Employees() : Surname(500) {}
};

这是插入的函数,但打印向量的元素根本不起作用:

void Process(Employees ZZ){

    string dateyear;
    string datemonth;
    string dateday;
    int dateyear1;
    int datemonth1;
    int dateday1;
    int Realage;
    int Vacationi = 0;

    for(int i = 0; i < 500; i++) {

        string s;
        cin >> s;
        string d;
        cin >> d;
        string c;
        cin >> c;

        ZZ.Surname.push_back(s);
        ZZ.FirstName.push_back(d);
        ZZ.birthdate.push_back(c);

        cout << endl << ZZ.Surname[1] << endl;
    }

现在是删除函数,如果我输入一个字符串然后在向量中搜索它然后获取他的索引然后删除,但是向量不会更新任何值。

void DeleteEmployee(Employees ZZ){

    cout<< endl <<  ZZ.Surname[1] << endl ;

    for (int i = 0; i < ZZ.Surname.size(); i++){
        cout << ZZ.Surname[i] ;
    }
    cout << " delete employee";
    string delete1;
    cin >> delete1;

    auto it = std::find(ZZ.Surname.begin(), ZZ.Surname.end(), delete1);
    if (it == ZZ.Surname.end())
    {
        cout<< " name not in vector "  << endl;
    }
    else
    {
        //auto index = distance(Names.begin(), find(Names.begin(), Names.end(), old_name_)));
        //ZZ.Surname.erase(ZZ.Surname.begin()+index) ;
    }
}

这是主要功能,向量的值也不打印:

int main()
{
    Employees ZZ;
    Process(ZZ);
    DeleteEmployee(ZZ);
    cout << "fyccck";

    for (int i = 0; i < ZZ.Surname.size(); i++){
        cout << ZZ.Surname[i] ;
    }
}

【问题讨论】:

    标签: c++ oop vector


    【解决方案1】:

    这段代码有很多问题。但是您要问的特定问题是由您的函数传递Employees 对象按值 引起的,因此复制 以及您对copy 没有反映在main()original 对象中。

    您需要更改参数以通过引用传递Employees对象:

    void Process(Employees &ZZ)
    void DeleteEmployee(Employees &ZZ)
    

    话虽如此,总体而言,代码的整体设计并不好。向量没有正确保持同步,因此您使用的向量比实际需要的多,1 个 vector 就足够了。而Process()DeleteEmployee() 应该是Employees 类的成员,而不是单独的函数。而且它们都在访问Surname 向量的边界。

    我建议从头开始完全重写代码,例如更像这样:

    struct Employee{
        string Surname;
        string FirstName;
        string BirthDate;
        int Vacation;
    
        string DisplayName() const { return Surname + ", " + FirstName; }
    };
    
    class Employees{
    public:
        static const int maxx = 500;
        vector<Employee> employees;
    
        Employees() { employees.reserve(maxx); }
    
        bool Add(const Employee &e);
        bool Delete(string Surname, string FirstName);
    };
    
    bool Employees::Add(const Employee &e) {
        if (employees.size() < maxx) {
            employees.push_back(e);
            return true;
        }
        return false;
    }
    
    bool Employees::Delete(string Surname, string FirstName) {
        auto it = std::find_if(employees.begin(), employees.end(),
            [&](const Employee &e){
                return e.Surname == Surname && e.FirstName == FirstName;
            }
        );
        if (it != employees.end()) {
            employees.erase(it);
            return true;
        }
        return false;
    }
    
    int main()
    {
        Employees ZZ;
    
        for(int i = 0; i < Employees::maxx; ++i) {
            Employee e;
            cin >> e.Surname;
            cin >> e.FirstName;
            cin >> e.BirthDate;
            e.Vacation = 0;//cin >> e.Vacation;
    
            ZZ.Add(e);
    
            cout << endl << e.DisplayName() << endl;
        }
    
        cout << " delete employee";
        string Surname, FirstName;
        if (cin >> Surname >> FirstName) {
            if (ZZ.Delete(Surname, FirstName)) {
                cout << " name deleted from vector " << endl;
            } else {
                cout << " name not in vector " << endl;
            }
        }
    
        cout << "fyccck";
    
        for (auto &e : ZZ.employees) {
            cout << e.DisplayName() << endl;
        }
    
        return 0;
    }
    

    【讨论】:

    • 你能给我简要介绍一下错误的事情吗?是的,通过引用传递它没关系,但在这里 { class Employees{ public: int maxx = 500;向量 姓氏;向量 名字;矢量 生日;国际假期[500];公共:员工():姓(500){}};它不会创建一个大小为 500 的向量我想为我搜索了很多的每个人创建一个大小为 500 的向量,这就是我找到的员工():姓氏(500){}
    • "它不会创建大小为 500 的向量" - 你有 3 个向量和 1 个固定数组,为什么?您的构造函数仅预先调整 1 个向量的大小。更糟糕的是,您要预先调整大小,然后再将 500 个元素推入其中。所以你所有的向量/数组都会不匹配。你为什么要使用 4 个单独的向量/数组? 1 个向量/数组就足够了,只需将每个人的信息放入 struct/class 即可。我为此添加了一个示例。
    • 我想要 3 个大小为 500 的向量来访问同一索引处的每个员工,例如在 0 索引处输入 Surname,FirstName,BirthDate 我可以在 0 索引处全部删除。对不起,我在 OOP 方面很弱,但是当我访问像这样的员工姓名时“cout
    • 您不需要 3 个向量。正如我在回答中所展示的那样,struct/class 元素的 1 个向量就足够了。您的替代方案不是一个好主意,它很容易出错(如您的原始代码所示)
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多