更改动态分配的数组

时间:2017-09-25 17:24:24

标签: c++ class variable-assignment dynamically-generated

我有两个动态分配的类对象数组 - 学生和员工。当用户输入年龄时,我希望根据年龄更新学生数组或人员数组的元素。 但我的下面的代码不起作用。一旦分配给学生,变量人员不会被重新分配给员工。无论我进入的年龄,我输入的所有数据都会进入学生。我的代码出了什么问题?我怎样才能有一个变量并根据条件检查为其分配一个或另一个数组元素?

#include <iostream>
using namespace std;

int main()
{
    class info
    {
    public:
        int unique_id;
        char* hair_color;
        int height;
        int weight;
    };

    class info* student;
    student = new info[10];

    class info* staff;
    staff = new info[10];

    for (int i=0; i<10;i++)
    {
        class info& person = student[i];

        int age ;
        cout<< "enter age"<<endl;
        cin >> age;

        if( age > 18 )
        {
            person = staff[i];  // This assignment doesn't work ??
        }
        cout<< "enter unique_id"<<endl;
        cin >> person.unique_id;
        cout<< "enter height"<<endl;
        cin >> person.height;
        cout<< "enter weight"<<endl;
        cin >> person.weight;

    }

    cout<<" Student "<<student[0].unique_id<<"   "<<student[0].height<<"\"  "<<student[0].weight<<endl;
    cout<<" Staff "<<staff[0].unique_id<<"  "<<staff[0].height<<"\"  "<<staff[0].weight<<endl;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

You cannot reseat a reference.一旦设置,它就会卡在那里,任何重新分配引用的尝试都将被解释为分配给引用变量的请求。这意味着

person = staff[i];

实际上是将staff[i];复制到person,这是student[i]的别名(另一个名称)。 student[i]将继续接收用户读取的输入。

在给定当前代码的情况下,最简单的方法是使用指针替换引用,该指针可以重新定位。

class info* person = &student[i]; // using pointer

int age ;
cout<< "enter age"<<endl;
cin >> age;

if( age > 18 )
{
    person = &staff[i];  // using pointer, but note: nasty bug still here
                         // You may have empty slots in staff 
}

cout<< "enter unique_id"<<endl;
cin >> person->unique_id; // note the change from . to ->
....

但是有很多方法可以解决这个问题。您可以延迟创建引用,直到知道要使用哪个数组。这需要在你的很多代码周围进行改组,如果你不小心的话,仍然会在数组中留下未使用的元素。

幸运的是,使用std::vector from the C++ Standard Library's container library.

有更好的方法
std::vector<info> student;
std::vector<info> staff;

for (int i=0; i<10;i++)
{
    info person; // not a pointer. Not a reference. Just a silly old Automatic

    int age ;
    cout<< "enter age"<<endl;
    cin >> age;

    // gather all of the information in our Automatic variable
    cout<< "enter unique_id"<<endl;
    cin >> person.unique_id;
    cout<< "enter height"<<endl;
    cin >> person.height;
    cout<< "enter weight"<<endl;
    cin >> person.weight;

    // place the person in the correct vector
    if( age > 18 )
    {
        staff.push_back(person);
    }
    else
    {
        student.push_back(person);
    }
}