2017-08-06 136 views
-1

到目前爲止,我一直在使用全局變量。我只記得這不是一個好習慣。那麼,有什麼辦法可以改變這個嗎?我應該通過變量作爲值還是參考?將值傳遞給C++函數

這是代碼 https://pastebin.com/JZaaR2Qd

using namespace std; 

string user_name; 
string str_age; 
unsigned short int user_age; 
char yes_no_prompt; 

void user_biodata_input() 
{ 
    cin.clear(); 
    cout << "Name : "; getline(cin >> ws, user_name); 
    cout << "Age : "; getline(cin, str_age); //taking age as a string 
    stringstream(str_age) >> user_age ; //extract int from a string 

    //Check if user input is not numeric, if so, repeat 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "Input invalid! Please re-enter your age in numeric..." << endl; 
     cin >> user_age; 
    } 
} 

int main() 
{ 
    //Speed up cin and cout 
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); 

    //Start 
    cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl; 
    cout << "Please provide your data..." << endl; 
    user_biodata_input(); 

    show_user_biodata(); 

    while (yes_no_prompt == 'N' || yes_no_prompt == 'n') 
    { 
     cout << "Please re-enter your biodata..." << endl; 
     user_biodata_input(); 
     show_user_biodata(); 
    } 
+0

當然,你可以通過引用傳遞。你有什麼問題? –

回答

0

好吧,如果你要使用C++,你最好儘量利用語言功能,因此它會更清潔呈現User類來封裝的內部表示用戶數據,你想收集。例如:

class User { 

    public: 
     User(string name, unsigned short int age):_name(name),_age(age) {} 

     bool confirm() { 
      cin.clear(); 
      char yes_no_prompt; 
      cout << "Thank you for providing your data..."; 
      cout << "\nPlease confirm your data...(Y/N)\n" << endl; 

      //printing border 
      cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl; 
      //printing student record 
      cout << setfill(' ') << setw(1) << "|" << setw(15) << left << "Name" << setw(1) << "|" << setw(15) << left << "Age" << setw(1) << "|" << endl; 
      //printing border 
      cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl; 
      //printing student record 
      cout << setfill(' ') << setw(1) << "|" << setw(15) << left << this->_name << setw(1) << "|" << setw(15) << left << this->_age << setw(1) << "|" << endl; 
      //printing border 
      cout << setfill('-') << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << setw(15) << "-" << setw(1) << "+" << endl; 
      //printing student record 

      cin >> yes_no_prompt; 

      if (yes_no_prompt == 'Y' || yes_no_prompt == 'y') 
      { 
       cout << "\nThank you for giving cooperation...\nWe will now proceed to the academy..." << endl; 
       return true; 
      } 
      return false; 
     } 
    private: 
     string _name; 
     unsigned short int _age; 
}; 

現在你可以實現的功能來收集用戶信息:

User createUser() 
{ 
    cin.clear(); 
    string user_name; 
    string str_age; 
    unsigned short int age; 
    cout << "Name : "; getline(cin >> ws, user_name); 
    cout << "Age : "; getline(cin, str_age); //taking age as a string 
    stringstream(str_age) >> age ; //extract int from a string 

    //Check if user input is not numeric, if so, repeat 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "Input invalid! Please re-enter your age in numeric..." << endl; 
     cin >> age; 
    } 
    return User(user_name, age); 
} 

最後主要會是這個樣子:

int main() 
{ 
    //Speed up cin and cout 
    ios_base::sync_with_stdio(false); 
    cin.tie(NULL); 

    //Start 
    cout << "Hi User, my name is Sirius. I'm your Digital Guidance (DG), nice to meet you..." << endl; 
    cout << "Please provide your data..." << endl; 

    User user = createUser(); 

    while (!user.confirm()) { 
     user = createUser(); 

    } 

    return 0; 

} 

當然,這還只是一個草案,建議,另一種選擇是讓你的兩個函數接收參數並能夠返回值。雖然面向對象方法海事組織更清潔。