2017-09-25 121 views
0

我有兩個動態分配的類對象 - 學生和工作人員數組。當用戶輸入年齡時,我希望根據年齡更新學生陣列或職員陣列的元素。 但我下面的代碼不起作用。一旦分配給學生,變量人員不會被重新分配給工作人員。無論我輸入的年齡如何,我輸入的所有數據都只會發放給學生。我的代碼有什麼問題?我怎麼能有一個變量,並根據條件檢查分配一個或其他數組元素?更改動態分配數組中元素的值

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

看起來像C++代碼。如果是這樣,請將C++標籤添加到您的問題。謝謝! –

+0

如果你有一個引用'int&rx = x;'如果你給這個引用賦新值,例如'rx = 5;',你認爲應該發生什麼?在你認爲分配不起作用的行中發生了什麼? –

+0

你不能[重新安置一個參考。](https://stackoverflow.com/questions/7713266/how-can-i-change-the-variable-to-which-ac-reference-refers)這會導致問題@ ArtemyVysotsky暗示。 – user4581301

回答

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