将值传递给C ++函数

时间:2017-08-06 07:02:33

标签: c++ function c++11 pass-by-reference

到目前为止,我一直在使用全局变量。我记得这不是一个好习惯。那么,有什么方法可以改变这个吗?我应该将变量作为值或引用传递吗?

这是代码 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();
    }

1 个答案:

答案 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;

}

当然这只是一个草案和建议,另一种方法是让你的函数接收参数并能够返回值。虽然OOP接近IMO更加清洁。