2017-08-06 123 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; 

} 

当然,这还只是一个草案,建议,另一种选择是让你的两个函数接收参数并能够返回值。虽然面向对象方法海事组织更清洁。