【问题标题】:How do you pass an object through a function using a pointer?如何使用指针通过函数传递对象?
【发布时间】:2017-03-26 09:23:24
【问题描述】:

我想通过一个使用指针的函数来传递一个对象 - 这也是一个向量。

我相信问题出现在第 75 行 (transaction(&user, userID);) 中,我尝试将对象“user”传递给函数“transaction”。 我不相信这些课程是相关的,所以我把它们排除在外。非常感谢你。这是source.cpp代码:

void transaction(vector<Customer *> &user, int userID);

void newAccount(vector<Customer*> & user, int userID);

void intr(vector<Customer*> & user, int userID, int account, int interest);

void loans(vector<Customer*> & user, int userID, int account, int loan);

int main()
{

    vector<Customer> user(3);

    user[0].setname("Josh");
    user[0].setID(1);
    user[0].bank[0].setbalance(100);
    user[0].bank[1].setbalance(101);
    user[0].bank[0].setoverdraft(200);
    user[0].bank[1].setoverdraft(201);
    user[0].accounts = 1;
    user[0].setpin(1202);

    user[1].setname("John");
    user[1].setID(2);
    user[1].bank[0].setbalance(102);
    user[1].bank[0].setoverdraft(202);
    user[1].accounts = 0;
    user[1].setpin(1203);

    user[2].setname("Jack");
    user[2].setID(3);
    user[2].bank[0].setbalance(103);
    user[2].bank[0].setoverdraft(203);
    user[2].accounts = 0;
    user[2].setpin(1204);

    int input;
    int userID;
    int pin;
    int account;
    bool menu = true;

    //Menu
    while (menu)
    {
        cout << " - Enter '1' to display all customer names and ID's." << endl;
        cout << " - Enter '2' for further transactions." << endl;
        cout << " - Enter '3' to make a quick withdrawal of " << char(156) << "10 from an account." << endl;
        cout << " - Enter '4' to exit." << endl;
        cin >> input;

        // List
        if (input == 1)
        {
            for (int i = 0; i < user.size(); i++)
            {
                cout << "[Name: " << user[i].getname() << "\t" << "ID: " << user[i].getID() << "]" << endl;
            }
            cout << endl;
        }
        // Transactions
        else if (input == 2)
        {
            cout << "Enter Customer ID: ";
            cin >> userID;
            cout << "Enter pin: ";
            cin >> pin;
            if (pin == user[userID].getpin())
            {
                transaction(&user, userID);
            }
            else { cout << "Pin invalid." << endl; }
        }
        // Quick withdrawal
        else if (input == 3)
        {   
            cout << "Enter Customer ID: ";
            cin >> userID;
            cout << "Enter pin: ";
            cin >> pin;
            cout << "Enter the account you wish to make a withdrawal from: ";
            cin >> account;
            if (pin == user[userID].getpin())
            {
                if (account <= user[userID].accounts)
                {
                    if (user[userID].bank[account].getbalance() - 10 <= -user[userID].bank[account].getoverdraft())
                    {
                        user[userID].bank[account].withdraw(10);
                    }
                    else { cout << "Insignificunt funds. Overdraft limit (" << char(156) << user[userID].bank[account].getoverdraft() << ")" << endl; }

                }
                else { cout << "That account does not exist." << endl; }
            }
            else { cout << "Pin invalid." << endl; }
        }
        // Exit
        else if (input == 4)
        {
            menu = false;
        }
    }

    return 0;
    }

    void transaction(vector<Customer *> &user, int userID){...}

错误描述:非常量引用的初始值必须是左值。

【问题讨论】:

    标签: c++ function pointers object vector


    【解决方案1】:

    您将错误的参数传递给transaction() 第一个参数采用对客户指针向量的引用

    std::vector<Customer*> &user
    

    但您传递的是客户向量地址

    vector<Customer> user(3);
    transaction(&user, userID);
    

    您应该将
    vector&lt;Customer&gt;
    更改为
    vector&lt;Customer*&gt; user(3)



    改变
    void transaction(vector&lt;Customer *&gt; &amp;user, int userID);

    void transaction(vector&lt;Customer&gt; &amp;user, int userID);

    如果您正在做同样的事情,其他功能也是如此。

    关于错误,你确定是这个问题吗?

    【讨论】:

    • 第二个选项,更改transaction 函数是更好的主意,假设Customer 不是一系列客户类型的基类。即使这样,它也应该通过引用传递。
    • 感谢您的回复!不幸的是,我在更改 void transaction(vector &user, int userID); 时遇到了这个错误。无效交易(向量 &user,int userID);描述多个重载函数“事务”实例与参数列表匹配
    • @JoshuaTalbot 您是否声明了多个transaction 函数,或者您是否包含一个已经具有事务函数的库?您可能没有更新transaction 的前向声明吗?
    • 当将 vector 更改为 vector user(3) 我得到这个错误:transaction(std::vector>,int) ': 无法将参数 1 从 'std::vector>' 转换为 'std::vector>'
    • @JoshuaTalbot 不要那样做。仅执行上述选项之一。不要两者都做。除非您想参加手动内存管理速成课程,否则不要走vector&lt;Customer *&gt; 路线。它要复杂得多。
    猜你喜欢
    • 2013-06-05
    • 2019-09-16
    • 2017-04-05
    • 1970-01-01
    • 2013-07-19
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多